这一章节我们来介绍同步阻塞、synchronized和volatile。
1.同步阻塞
之前我们提到过synchronized放在同步方法上:
public synchronized void transfer(int fromAccount, int toAccount, double money) { if (accounts[fromAccount] < money) { return; } accounts[fromAccount] -= money; System.out.printf("从" + fromAccount + "账户转出%10.2f元,", money); accounts[toAccount] += money; System.out.printf("从" + toAccount + "账户转入%10.2f元,", money); System.out.printf("总数:%10.2f元", getTotal()); System.out.println(); }
其实他的等价代码是这样的:
private Object lock = new Object(); public void transfer(int fromAccount, int toAccount, double money) { synchronized (lock) { if (accounts[fromAccount] < money) { return; } accounts[fromAccount] -= money; System.out.printf("从" + fromAccount + "账户转出%10.2f元,", money); accounts[toAccount] += money; System.out.printf("从" + toAccount + "账户转入%10.2f元,", money); System.out.printf("总数:%10.2f元", getTotal()); System.out.println(); } }
上面的lock扮演的就是我们平常所说的那把锁,只有持有这把锁,线程才能进入方法进行操作,而synchronized就是控制这把锁一次只能给一个线程持有,从而实现同步阻塞。
2. volatile
volatile是另一种实现线程阻塞的方法,但是他具有局限性:就是只完成变量赋值,而不执行其他操作。
可行的方式:
package com.ray.ch17; public class Test { private volatile boolean isDone; public boolean isDone() { return isDone; } public void setDone(boolean isDone) { this.isDone = isDone; } }
等价代码:
package com.ray.ch17; public class Test { private boolean isDone; public synchronized boolean isDone() { return isDone; } public synchronized void setDone(boolean isDone) { this.isDone = isDone; } }
不可行的方式:
package com.ray.ch17; public class Test { private volatile boolean isDone; public void flipDone() { isDone = !isDone; } }
总结:这一章节主要介绍同步阻塞和volatile的使用情况。
这一章节就到这里,谢谢。
-----------------------------------
目录