java并发编程锁2
synchronized public void test()含义:
synchronized修饰的非静态方法、同步代码块的synchronized (this)用法和synchronized (非this对象)使用的是对象锁,线程想要执行对应同步代码,需要获得对象锁。
synchronizedstaticpublic void test()含义:
synchronized修饰的静态方法以及同步代码块的synchronized (类.class)使用的是类锁,线程想要执行对应同步代码,需要获得类锁。
[if !supportLists]l[endif]synchronized (this)
线程获取的是同步块synchronized (this)括号()里面的对象实例的对象锁。
[if !supportLists]l[endif]synchronized (非this对象)
线程获取的是对象锁。
[if !supportLists]l[endif]synchronized static
线程获取的是类锁。
[if !supportLists]l[endif]synchronized (class)
线程获取的是类锁。
[if !supportLists]1.1[endif]新的锁机制
包:java.util.concurrent.locks
功能:提供了比synchronized更加广泛的锁定操作。Lock接口有3个实现它的类:ReentrantLock、ReetrantReadWriteLock.ReadLock和ReetrantReadWriteLock.WriteLock,即重入锁、读锁和写锁。lock必须被显式地创建、锁定和释放,为了可以使用更多的功能,一般用ReentrantLock为其实例化。为了保证锁最终一定会被释放(可能会有异常发生),要把互斥区放在try语句块内,并在finally语句块中释放锁,尤其当有return语句时,return语句必须放在try字句中,以确保unlock()不会过早发生,从而将数据暴露给第二个任务。