synchronized 与 ReentrantLock
2019独角兽企业重金招聘Python工程师标准>>>
synchronized 作用于非静态方法
public class Sync implements Runnable{private static int count;public Sync() {count = 0;}public synchronized void add() {for (int i = 0; i < 5; i++) {try {System.out.println(Thread.currentThread().getName() + " --- " + (++count));Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}@Overridepublic void run() {add();} }test1 :
public void test() {Sync sync1 = new Sync();Sync sync2 = new Sync();Thread t1 = new Thread(sync1);t1.start();Thread t2 = new Thread(sync2);t2.start();try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}由于两个线程传入了两个不同的 Sync 对象,相当于两把锁。运行结果是两个线程互相切换的;如果传入的是同一个对象,线程之间不会乱序,因为是同一把锁,会互斥等待。
以下两种写法等价: public synchronized void method( ) {//todo}public void method( ) {synchronized (this){ //todo} }以下两种写法也是等价的: public static synchronized void method( ) {//todo}public void method( ) {synchronized (xxx.class){ //todo} }如果 Sync 类的 add 方法上面加 static 关键字,同样运行test1 的代码结果不会乱序。因为这时 Sync 类的所有对象共享一把锁。
总结:
无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;
如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。
如果加的是对象锁,每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码
除了使用 synchronized 之外, 我们还可以使用 ReentrantLock 来实现同步。 ReentrantLock 与 synchronized 相似,都具备线程重入特性,只是写法上有点区别。ReentrantLock 需要显示的声明出来,并配合(lock( ), unlock( ), try/finally 语句块来完成)。ReentrantLock 增加了一些高级功能:
转载于:https://my.oschina.net/freedemon/blog/1810155
总结
以上是生活随笔为你收集整理的synchronized 与 ReentrantLock的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: error: style attribu
- 下一篇: 享元模式(十)