从头认识java-17.4 详解同步(4)-同步阻塞、synchronized和volatile

来源:互联网 发布:增加一列的sql语句 编辑:程序博客网 时间:2024/06/08 13:57

这一章节我们来介绍同步阻塞、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的使用情况。

 

这一章节就到这里,谢谢。

-----------------------------------

目录

 

0 0
原创粉丝点击