Synchronized和Lock是Java中锁的两个基本工具。
Synchronized用在方法和代码块上的区别:
用在方法签名上,当某个线程调用此方法时,会获取该实例的对象,方法结束前,其他线程只能去等待,当这个方法执行完成后,其他线程才有机会去抢占这把锁,执行方法。但是发生这一切的基础是所有线程使用同一个对象实例,才能实现互斥的现象。否则Synchronized关键字将失去意义。
(如果该方法为类方法,即其修饰符为static时,某个线程调用此方法时会拥有该类的锁,只要该线程在当前方法内运行,其他线程依然无法获得方法的使用权。)
用在代码块上,当线程运行到该代码块内,就会拥有对象的锁,如果多线程共享一个对象,就会形成互斥。使用代码块,可以只对需要同步的代码进行同步,这样大大的提高了效率。
总结:代码块的优势:
可以只对需要同步的地方使用。
与 wait() notify() notifyAll()一起使用,比较方便