第四章多线程访问同步方法的7种情况
2020-07-05 本文已影响0人
西西_20f6
1,两个线程同时访问一个对象的同步方法
同步(互斥)执行
2,两个线程访问的是两个对象的同步方法
可同时执行
3,两个线程访问的是synchronized的静态方法(需要获得类锁)
同步执行
4,同时访问同步方法与非同步方法,一个线程访问同步方法,另一个线程访问非同步方法。
没啥关系,可同时进行。非同步方法不会因为其他方法加了同步关键字而受到影响。
5,访问同一个对象的不同的普通同步方法
同步执行,要获取到同一个对象锁。
6,同时访问静态synchronized和非静态synchronized方法
一个线程t1访问静态synchronized,另一个线程t2访问非静态synchronized方法,两者没有影响,可以各自执行。
7,方法抛出异常后,会释放锁。
synchronized与Lock interface作比较:
在Lock 中,即便抛出了异常,如果没有手动释放Lock ,是不会释放的,必须在try{}catch(){}的finally中释放。
而对于synchronized来说,如果抛出了异常,会自动释放锁。
二、总结7种情况:
1, 同一把锁只能同时被一个线程获取,没有拿到锁的线程必须等待Block(对应第1、5种情况)
2,每个实例都对应有自己的一把锁,不同实例之间互不影响。(例外:锁对象是*.class以及Synchronized修饰的是static方法的时候,所有这个类的对象共用同一把类锁(对应2、3、4、6种情况))
3,无论是方法正常执行完毕或者方法抛出异常,都会释放锁(对应第7种情况)