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

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

(0)

相关推荐

  • 如何处理线程死锁

    在上一篇文章中,我们用 Account.class 作为互斥锁,来解决银行间的转账问题,虽然这个方案不存在并发问题,但是所有的账户的转账都是串行的,例如账户 A 转账户 B.账户 C 转账户 D 这两 ...

  • 2.使用synchronized关键字实现多线程的同步和互斥(不同线程同时读写同一数据)

    利用能量守恒定律实现多线程的同步和互斥 - EnergySystem.java:能量类 - EnergySystemTest.java:测试Main类 - EnergyTransferTask.jav ...

  • java学习——111.线程的状态

    线程是从创建到执行完毕,总共有6个状态, 1. New(新建态) 当用new操作符创建一个新线程时,如 new Thread(r), 该线程还没有开始运行.这意味着它的状态是new. 2. Runna ...

  • Java学习——114.交互线程

    线程在执行的过程中,有可能会需要共享资源或者交换数据,则称这一组线程为交互线程. 线程间的交互存在两种关系:竞争和协作. 竞争关系是指,两个线程同时使用同一个资源时,会产生竞争.此时,由于线程的并发执 ...

  • Java学习-注解和反射

    注解 java.Annotation Annotation的作用:可以呗其他程序读取 Annotation的格式 注解是:@注释名 在代码中存在,还可以添加一些参数 ​@SuppressWarning ...

  • Java学习-多线程

    多线程 任务(Task).进程(Process).线程(Thread) 进程的创建 1.继承Thread类 自定义线程类继承Thread类 重写run()方法,编写线程执行体 创建线程对象,调用sta ...

  • Java学习-Mybatis

    Mybatis Maven依赖: <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependenc ...

  • Java 学习笔记

    您对计算机(电脑)有了解吗? 计算机组成 系统软件 直接和硬件交互的软件叫系统软件,例如 win7.win8.Linux.mac等操作系统 应用软件 通常在运行在系统软件上,也就是在系统软件上开发的软 ...

  • jmeter压测学习15-setUp线程组实现用户先登录

    前言 setUp线程组 我们需要测试的是查询用户个人信息接口:/api/v1/userinfo,但是查询接口需要有用户登录的token才有权限去访问. 那么我们的前置操作就是先登录,取出token,后 ...

  • jmeter压测学习16-setUp线程组批量登录

    前言 前面一篇已经实现了在 setUp 线程组实现单个用户先登录后提取token给其它线程组使用,在压测的时候,单个用户登录很显然不能满足我们的压测需求. 我们在压测接口的时候,需批量获取多个用户登录 ...

  • jmeter压测学习19-tearDown线程组使用JDBC清理测试数据

    前言 在使用jmeter测试的时候,测试之前会有个数据准备工作,测试完成后如果产生了一些多余的数据,我们应该对数据还原清理相关的测试数据. 测试结束使用tearDown线程组清理本次测试产生的多余数据 ...