本文共 3100 字,大约阅读时间需要 10 分钟。
1)语法:作为方法的修饰符出现 作为代码块出现
public class SynchronizedDemo{ public synchronized void method(){ //具体代码 } }
说明:java中每个对象都有一个锁,叫监视锁(monitor lock)
作用:SynchronizedDemo o=new…(); o.method() 2)执行带synchronized修饰的普通方法时,首先需要lock引用指向的对象中的锁 如果可以锁,就正常执行代码 否则,需要等其他线程把锁unclock 如果一个线程lock到了锁,到方法执行结束时,就会unlock这把锁 3)锁在什么地方? 针对普通方法,所在调用该方法的引用指向的对象中(this) synchronized代码表现 表现 锁的对象 什么时候加 什么时候释放 修饰普通方法 this 进入方法 退出方法 修饰静态方法 类 进入方法 退出方法 代码块 小括号引用指向的 进入代码块 退出代码块 Person.class就是类的对象(反射的知识) 代码示例1:锁的Synchronized对象public class SynchronizedDemo { public synchronized void method(){ } public static void main(String[] args) { SynchronizedDemo demo=new SynchronizedDemo(); demo.method(); //计入方法会锁demo指向对象中的锁,出方法会释放demo指向对象中的锁 }}
代码示例2:锁的Synchronized类的对象
public class SynchronizedDemo { public synchronized static void method(){ } public static void main(String[] args) { method();//进入方法会锁SynchronizedDemo.class指向对象中的锁; //出方法会释放SynchronizedDemo.class中的锁 }}
代码示例3:明确锁的对象
public class SynchronizedDemo { public void method(){ synchronized (this){ } } public static void main(String[] args) { SynchronizedDemo demo=new SynchronizedDemo(); demo.method(); }}
代码示例:
class MyThread implements Runnable { private int ticket = 1000; @Override public void run() { for (int i = 0; i < 1000; i++) { synchronized (this) { if (this.ticket > 0) { try { Thread.sleep(20); } catch (InterruptedException e) { } System.out.println(Thread.currentThread().getName() + ",还有" + this.ticket-- + "张票"); } } } }}public class TestDemo { public static void main(String[] args) { MyThread mt=new MyThread(); Thread t1=new Thread(mt,"黄牛A"); Thread t2=new Thread(mt,"黄牛B"); Thread t3=new Thread(mt,"黄牛C"); t1.start(); t2.start(); t3.start(); }}
1.语法:修饰变量-变量修饰符
1)保证该变量的可见性问题 2)可以部分保证代码的重排序问题Object object=new Object();
1.new 2.初始化 3.对象到引用的赋值 2可见性 可以保证重排序1)wait方法:使线程停止运行
方法wait()的作用就是使当前执行代码的线程进行等待,wait(0方法是Object类的方法,该方法是用来将当前线程置入“与执行队列”中,并且在wait()所在的代码处执行,直接接到通知或被中断为止。 wait()方法只能在同步方法中或同步块中调用.如果调用wait()时,没有持有适当的锁,会抛出异常。 wait()方法执行后,当前线程释放锁,线程与其他线程竞争重新获取锁。 代码示例:观察:wait方法使用public class Main2 { public static void main(String[] args) throws InterruptedException { Object object = new Object(); synchronized (object) { System.out.println("等待中..."); object.wait(); System.out.println("等待已过..."); } System.out.println("main方法结束"); }}
2)notify()方法:使停止的线程继续运行
notify()也要在同步方法或同步块中调用,该方法是用来通知那些可能等待该对象的对象锁的其他线程,对其发出通知notify,并使它们重新获取该对的对象锁。如果有多个线程等待,则有线程规划器随机挑选出一个呈wait状态的线程 在notify()方法后,当前线程不会马上释放该对象锁,要等到执行notify()方法的线程将程序执行完,也就是推出同步代码块之后才会释放对象锁3)notifyAll()方法
一次唤醒所有等待线程转载地址:http://fylzi.baihongyu.com/