概述
在一个模拟银行取钱的例子上,直接把synchronized加到了run方法上,发现并没有解决并发带来的不安全性。
class GetMoney extends Thread{
private Account account;
private Integer needMoney;
public GetMoney(Account account, Integer needMoney) {
this.account = account;
this.needMoney = needMoney;
}
@Override
public synchronized void run() {
if(account.getMoney()-needMoney<0){
System.out.println(Thread.currentThread().getName()+"取钱时,钱不够!!!!!!!!!!!!");
return;
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
account.setMoney(account.getMoney()-needMoney);
System.out.println(account.getName()+"还有"+account.getMoney());
System.out.println(Thread.currentThread().getName()+"手上有"+needMoney);
}
}
证明有多个线程都能访问到run方法,并没有起到锁的效果,发现当继承Thread父类的时候,每次创建都会new一个新的对象,相当于每个线程都有一个synchronized锁,锁的是this对象,所以无法解决不安全性的问题。
第一种解决方法:将线程改为继承runnable接口
这样在主线程中创建线程时,就只需要一个对象,解决了这个问题
public static void main(String[] args) {
Account account=new Account(600,"公司账户");
GetMoney getMoney=new GetMoney(account,400);
new Thread(getMoney,"小红").start();
new Thread(getMoney,"小明").start();
}
第二种解决方法:使用对象锁代码块synchronized(obj){}
的方式
直接锁account对象,来实现时间段内只有一个线程在操作这一对象
synchronized (account){
if(account.getMoney()-needMoney<0){
System.out.println(Thread.currentThread().getName()+"取钱时,钱不够!!!!!!!!!!!!");
return;
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
account.setMoney(account.getMoney()-needMoney);
System.out.println(account.getName()+"还有"+account.getMoney());
System.out.println(Thread.currentThread().getName()+"手上有"+needMoney);
}
最后
以上就是超帅板凳为你收集整理的synchronized锁run()的问题的全部内容,希望文章能够帮你解决synchronized锁run()的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复