首先关于锁和同步,有一下几个要点:
1)、只能同步方法,而不能同步变量和类;
2)、每个对象只有一个锁;当提到同步时,应该清楚在什么上同步?也就是说,在哪个对象上同步?
3)、不必同步类中所有的方法,类可以同时拥有同步和非同步方法。
4)、如果两个线程要执行一个类中的synchronized方法,并且两个线程使用相同的实例来调用方法,那么一次只能有一个线程能够执行方法,另一个需要等待,直到锁被释放。也就是说:如果一个线程在对象上获得一个锁,就没有任何其他线程可以进入(该对象的)类中的任何一个同步方法。
5)、如果线程拥有同步和非同步方法,则非同步方法可以被多个线程自由访问而不受锁的限制。
6)、线程睡眠时,它所持的任何锁都不会释放。
7)、线程可以获得多个重进入(synchronized )锁。比如,在一个对象的同步方法里面调用另外一个对象的同步方法,则获取了两个对象的同步锁。
8)、同步损害并发性,应该尽可能缩小同步范围。同步不但可以同步整个方法,还可以同步方法中一部分代码块。
9)、在使用同步代码块时候,应该指定在哪个对象上同步,也就是说要获取哪个对象的锁。
同步方法:
1):
同步静态方法:某个类Object中的某个静态方法staticMethod加上同步锁之后,当某个线程
Thread
调用staticMethod时该线程会获取Object类的锁(当前Object的锁没被其它线程获取时,若当前Object锁被其它锁获取则会进行等待。),此时其他任何线程在Thread释放锁前都无法调用Object类中任何的同步静态方法。
2):同步非静态方法:某个类Object中的某个非静态方法Method加上同步锁之后,当某个线程Thread调用Method时会获取所对应的Object对象的锁,此时其他线程在Thread释放锁前都无法调用改对象中的任何同步非静态方法(所有非静态同步方法都共用其所属的对象的锁)
3):
两者区别:
前提:Object 中包含静态同步方法staticMethod01,
staticMethod02
, 非静态同步方法Method01 , Method02,线程Thread1 和 Thread2:
Object obj1 = new Object();
Object obj2 = new Object();
a.当Thread1调用obj1.Method01()时,若Thread2想调用obj1.Method01()或者obj1.Method01()都需要先等待obj1.Method01()执行完释放锁才能进行调用。
b.
当Thread1调用obj1.Method01()时,
Thread2可以不用等待Thread01释放锁即可调用obj2.Method01()或者 obj2.Method02();
因为非静态同步方法的锁是相对于对象而言。
c.当Thread1 调用obj1.staticMethod01()时,Thread2不管是调用obj1.staticMe01()还是obj2.staticMethod01()都需要等待Thread1释放锁后才能进行调用。
因为静态同步方法的锁是相对于类而言
同步代码块跟同步方法的异同:
1.同步方法是指对整个方法进行加锁同步,而同步块是指对方法内的某个代码块进行加锁同步。
2.同步方法的锁用的是其实例对象本身,而同步代码块的锁可以自己指定。
目前理解的就这么多了,希望各位多多指出错误和欠缺的地方。