package d1202;
public class AccountRunnerble implements Runnable {
private final Account account = new Account();
private int withDrawCount = 0;
public AccountRunnerble(int count){
withDrawCount = count;
}
@Override
public void run() {
/**
* 形成的同步的解决方案1:同步代码块
* 总结1:认识同步监视器(锁):
* synchronized(同步监视器){}
* 1.必须引用数据类型,不能是基本类型
* 2.在同步代码块中可以改变监视器对象的值,不能改变引用
* 3.尽量不要String和包装Integer做同步监视器,如果使用了,只要保证代码块中不对器进行任何操作也可以
* 4.一般使用共享资源做同步监视器,没有任何业务含义
* 5.也可以创建一个没有任何含义的同步监视器(ex: Object object = new Object())
* 6.建议使用final修饰同步监视器
*/
/**
* 总结:同步代码块的执行过程
* 1.A线程来到同步代码块,发现同步监视器open状态,需要close(进入后close),然后执行其中的代码
* 2.A线程执行过程中,发生了线程切换(阻塞,就绪),A线程失去了CPU,但是没有开锁open(此时同步锁是close状态,其它线程不能进入同步代码块)
* 3.B线程获取CPU,来到执行同步代码块,发现同步监视器是close状态,则无法执行其中代码,B线程也进入阻塞状态
* 4.A线程获取CPU后,执行后续代码,不同代码块执行完毕,释放锁open(此时同步锁是open状态)
* 5.B线程获取CPU后,来到同步锁,此时锁是open状态,进入同步代码块,需要close(如同A线程的实行流程)
*/
synchronized (account){
if(account.getMoney()-withDrawCount>0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
account.withDraw(withDrawCount);
System.out.println(Thread.currentThread().getName()+"取款成功,当前余额:"+account.getMoney());
}else {
System.out.println(Thread.currentThread().getName()+"余额不足,当前余额:"+account.getMoney());
}
}
}
}
线程同步synchronized锁
猜你喜欢
转载自blog.csdn.net/mlh532354163/article/details/103342024
今日推荐
周排行