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();
 }
}

 

 

时间: 2024-11-25 18:25:17

java线程学习4——线程同步之同步代码块的相关文章

java线程学习1——线程基本概念和操作

  一.创建线程的两种方式   1 继承Runnable接口 public class ThreadImpRunnable implements Runnable{  /**   * 线程运行时执行的方法   */  public void run()  {   for (int i = 0; i < 500; i++)   {    System.out.println(Thread.currentThread().getName() + i);   }  } }   public class

java多线程学习之线程同步

基本上感觉自己学习的东西都是学会了立马就用,很少有机会能专门花时间去学习一些东西,近些时候不忙,准备把公司的面试题全做一遍,难的倒是不多,但是很多人都不会做,问题就是出在实践上. 言归正传.多线程就目前而言,纯是兴趣上的学习,并没有真实的应用场景.以前觉java多线程很乱,很多概念没似懂非懂,但是实战中写几个实例就一目了然了. 昨天练习线程安全时提到了synchronized关键字,其作用原理其实就是把一个或者一部份资源锁住,只允许当前这个进程使用.我理解线程同步就让各个线程之间能够控制资源的分

java线程学习6——线程同步之同步锁

  import java.util.concurrent.locks.ReentrantLock; public class Account {  /**   * 同步锁   */  private final ReentrantLock lock = new ReentrantLock();  /**   * 账户号   */  private String accountNo;  /**   * 账户余额   */  private double balance;  public Acco

java线程学习5——线程同步之同步方法

  public class Account {  /**   * 账户号   */  private String accountNo;  /**   * 账户余额   */  private double balance;  public Account()  {   super();  }  public Account(String accountNo, double balance)  {   super();   this.accountNo = accountNo;   this.

java线程学习2——线程的生命周期

    该图摘自<疯狂的java讲义>,该书讲述的线程很详细.   其中新建状态和死亡状态的线程的isAlive属性均返回false,值得注意的是对死亡的线程调用start方法或 对新建的线程调用两次start 方法均会抛出illegalThreadStateException异常.  

java线程学习3——线程的停止

  方法一 stop方法 Thread t = new Thread(new MyThread()); t.stop();   非常不友好,该方法已经被废弃.使用该方法,线程直接停止,可能很多资源没有关闭,还有可能造成死锁.     方法二 interrupt方法 public class SleepThread implements Runnable {  /**   * 线程运行时执行的方法   */  public void run()  {   try   {    // 该线程进入阻塞

我的Java开发学习之旅------&amp;gt;Java经典面试题

摘自张孝祥itcast 从享受生活的角度上来说:"程序员并不是一种最好的职业,我认为两种人可以做程序员,第一,你不做程序员,你就没有什么工作可做,或者说是即使有可以做的工作但是你非常不愿意去做:第二,你非常痴迷和爱好程序,并且在这方面有一些天赋和优势.程序员的结局也是有两种:第一,默默退休,第二以程序员为起点或跳板,注意积累,跟对了好的老板或团队,找到和很好的搭档自己创业,成为IT金领和富翁." 人们在时间面前是平等的,吾生也有涯,所以,你的经验更丰富点,那不算什么,经验是用时间积累的

对象-Java基础学习遇见的问题

问题描述 Java基础学习遇见的问题 我是将自定义的对象,存储到了ArrayList集合中,出现下面错误,咋回事啊 多谢各位大神! 解决方案 19行的public拼错了少了b 解决方案二: ArrayList 里面应该加参数吧 ArrayList> list= new ArrayList>();这样定义试试 解决方案三: 黑马程序员 Java基础学习笔记 线程安全问题java基础问题01java基础问题18 解决方案四: 特殊词都带色的,,,拼错了色不对... 解决方案五: 用的什么开发工具啊

JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this

JAVA之旅(十三)--线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程)把票陆陆续续的卖完了之后,我们要反思一下,这里面有没有安全隐患呢?在实际情况中,这种事情我们是必须要去考虑安全问题的,那我们模拟一下错误 package com.lgl.hellojava; import javax.security.auth.callback.TextInputCallback