一、synchronized的两种用法
1、对象锁形式
a、同步代码块(自己指定所对象)
synchronized (this){}
b、普通方法锁(默认锁对象为this当前实例对象)
public synchronized void method()
2、类锁形式
a、静态方法锁
public static synchronized void method()
b、(*).class锁
synchronized (*.class){}
二、多线程访问同步方法的7种具体情况
1、两个线程同时访问一个对象的同步方法
没有拿到锁的线程必须等待。(类SynchronizedObjectMethod3)
2、两个线程访问的是两个对象的同步方法
每个对象都对应有自己的一把锁,不同对象(在此特指实例)之间互不影响。互不影响,无须线程等待。
3、两个线程访问的是synchronized的静态方法
同一把锁,需要线程等待。虽然是不同的实例,但是所对应的锁对象是同一把。参考代码类(创建两个实例!)
4、同时访问同步方法和非同步方法
互不影响,无须线程等待。(类SynchronizedYesAndNo6)
5、访问同一个对象的不同的普通同步方法
同一把锁,需要线程等待。(类SynchronizedDifferentMethod7)
6、同时访问静态synchronized方法和非静态synchronized方法
互不影响,无须线程等待。(类SynchronizedStaticAndNormal8)
7、方法抛异常后,会释放锁
网友评论