分享

java学习——115.线程的互斥

 pythonjava学习 2021-04-06

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

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

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

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

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方法,其运行结果如下:

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

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多