打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
java学习——115.线程的互斥

线程互斥是解决线程间竞争关系的手段。

在上一篇中,由于两个线程对同一个账户资源进行操作,两线程在同时对“张三”这个账户时进行操作时,存在着竞争关系,就造成了输出结果的不正确。

要解决这个问题,就要使账户在同一时间里只能被一个线程占用,只有当这个线程执行完了,才释放此资源供其它线程调用。

线程互斥指的就是若干个线程要使用同一共享资源时,任何时刻最多允许一个线程去使用,其他要使用该资源的线程必须等待,直到占有资源的线程释放该资源。

1、互斥实现

Java提供关键字synchronized用于声明一段程序为临界区,使线程对临界资源采用互斥使用方法。

其语法如下:

synchronized(对象)

    语句

2、例

同上篇中例。

改写时Account和exa两个类不变,只需要在取钱类和存钱类中分别添加声明为临界资源的语句即可。详见注释

public class SaveMoney extends Thread{

    private Account account;

    private doublevalue;

    public SaveMoney(Account a,double v) {

       this.account=a;

       this.value=v;

    }

    public void run() {

       synchronized(this.account){//声明 account为临界资源,只能被互斥使用

           this.account.cunqian(value);

           System.out.println("存入"+value+"后,您的账户余额为:"+this.account.money);

       }

    }

}

public class getMoney extends Thread{

    private Account account;

    private doublevalue;

    public getMoney(Account a,double v) {

       this.account=a;

       this.value=v;

    }

    public void run() {

       synchronized(this.account){//声明 account为临界资源,只能被互斥使用

           this.account.quqian(value);

           System.out.println("取出"+value+"后,您的账户余额为:"+this.account.money);

       }

    }

}

此时再运行exa中的main方法,其运行结果如下:

此时的结果就是正常的运行结果了。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Java面试题全集(1.4)
如何处理线程死锁
博客园 - Allen Young - 当Singleton遇到multi-threading
线程的同步-同步块(十三)
Java面试题--设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1
一个想休息的线程:JVM到底是怎么处理锁的?怎么不让我阻塞呢?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服