`
wsql
  • 浏览: 11777281 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

java线程学习4——线程同步之同步代码块

 
阅读更多

模拟一个场景,两个人对同一个账户同时取钱

package cn.xy.Thread;

public class Account
{
/**
* 账户号
*/
private String accountNo;
/**
* 账户余额
*/
private double balance;

public Account()
{
super();
}

public Account(String accountNo, double balance)
{
super();
this.accountNo = accountNo;
this.balance = balance;
}

@Override
public int hashCode()
{
return accountNo.hashCode();
}

@Override
public boolean equals(Object obj)
{
if (null != obj && obj.getClass() == Account.class)
{
Account target = (Account) obj;
return target.accountNo.equals(accountNo);
}
return false;
}

/***************************************************************************/

public String getAccountNo()
{
return accountNo;
}

public void setAccountNo(String accountNo)
{
this.accountNo = accountNo;
}

public double getBalance()
{
return balance;
}

public void setBalance(double balance)
{
this.balance = balance;
}
}

package cn.xy.Thread;

public class DrawThread extends Thread
{
/**
* 模拟账户
*/
private Account ac;

/**
* 当前取钱线程希望取得的钱数
*/
private double drawAmount;

public DrawThread(String name, Account ac, double drawAmount)
{
super(name);
this.ac = ac;
this.drawAmount = drawAmount;
}

@Override
public void run()
{
// 同时需要操作的账户作为同步监视器,synchronized{}中的代码被称为同步代码块
synchronized (ac)
{
if (ac.getBalance() >= drawAmount)
{
System.out.println(getName() + "取出钞票成功" + drawAmount);
ac.setBalance(ac.getBalance() - drawAmount);
System.out.println("余额为" + ac.getBalance());
}
else
{
System.out.println("余额不足");
}
}
}
}

package cn.xy.Thread;

public class Test
{
public static void main(String[] args)
{
Account ac = new Account("00000001",1000);
Thread t1 = new Thread(new DrawThread("Lily", ac, 800));
Thread t2 = new Thread(new DrawThread("Tom", ac, 800));
t1.start();
t2.start();
}
}

分享到:
评论

相关推荐

    Java学习源码Java多线程的代码

    在char03包里放置了Java线程间通信的知识的代码。内容如下: 等待/通知机制 join方法的使用 在char04包里放置了Java中Lock类的知识的代码,内容如下: Lock类 Lock类其他功能 Condition类 Condition类其他...

    iwehdio#Java_learning_notes#4、多线程知识点1

    1、基础概念多线程与并发(一)——概述、线程状态进程与线程区别?多线程与并发(二)——线程同步、线程协作同步方法和同步代码块?多线程与并发(三)——JUC概述、

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...

    Java并发学习笔记(二)——Synchronized关键字与ReetrantLock同步锁

    一、Synchronized ...被Synchronized 关键字描述的方法或代码块在多线程环境下数据是同步的,即当获取到锁后先将内存复制到自己的缓存中操作,释放锁之前会把缓存中的数据复制到共享内存中,所以保证了可

    Java开发详解.zip

    000000_【课程介绍 —— 写在前面的话】_Java学习概述笔记.pdf 010101_【第1章:JAVA概述及开发环境搭建】_JAVA发展概述笔记.pdf 010102_【第1章:JAVA概述及开发环境搭建】_Java开发环境搭建笔记.pdf 010201_【第2...

    Java——volatile关键字详解

    写入volatile变量相当于退出同步代码块,读取volatile变量相当于进入同步代码块。 volatile的使用场景 对变量的写入操作不依赖变量的当前值,或能确保只有单个线程更新变量的值; 该变量不会与其他状态变量一起纳入...

    Java开发技术大全 电子版

    3.7.3静态代码块136 3.7.4再论静态成员变量137 3.8main()方法和命令行参数139 3.9结束方法141 3.10本地方法141 3.11本章小结144 第4章继承与多态145 4.1继承的基本原理145 4.2子类对父类的继承146 4.3属性...

    Lock锁的底层原理完整版

    Lock锁,一种线程同步机制,其主要功能是防止多个线程同时访问同一代码块,从而避免因并发问题引发的数据不一致或其他错误。Lock锁的灵活性相比synchronized更高,它支持手动获取和释放锁,能够中断的获取锁以及超时...

    javaSE代码实例

    第16章 多线程——Java中的并发协作 343 16.1 线程的基本知识 343 16.1.1 多线程编程的意义 343 16.1.2 定义自己的线程 344 16.1.3 创建线程对象 345 16.1.4 启动线程 347 16.1.5 同时使用多个线程 ...

    asp.net知识库

    通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到...

    java经典面试2010集锦100题(不看你后悔)

    —————————————————————————————————————— 题目1: 下面不属于基本类型的是:c (选择1项) A) boolean B) long C) String D) byte 题目2:d 如下程序中: (1)public class ...

    Android程序设计基础

     本书最后提供了一个附录,其中列出了Android与Java SE(Java Standard Edition,Java标准版)之间的不同之处。 . 在线资源  本书网站http://pragprog.com/titles/eband提供了以下资源。  本书使用的所有示例...

    新版Android开发教程.rar

    与谷歌日历同步;与 Android Market 联机;支持谷歌 “ 街景 ” 服务;包装盒内附 数据工具包。 更多信息 https://sites.google.com/a/android.com/opensource/release-features Android Android Android Android ...

    C#微软培训资料

    1.1 Microsoft.NET——一场新的革命.4 1.2 .NET 与 C#.6 1.3 C#语言的特点.8 1.4 小 结 .11 第二章 运行环境 全面了解.NET.12 2.1 .NET 结构.12 2.2 公用语言运行时环境与公用语言规范.13 2.3 开 发 ...

Global site tag (gtag.js) - Google Analytics