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.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;
 }

 /**
  * 同步方法,同步方法的监视器是this,同步方法可以将该类变为线程安全的类
  * 任何时候只有一个线程获得对Account对象的锁定,然后进入draw方法进行取钱
  */
 public synchronized void draw(double drawAmount)
 {
  if (balance >= drawAmount)
  {
   System.out.println(Thread.currentThread().getName() + "取出钞票成功" + drawAmount);
   balance -= drawAmount;
   System.out.println("余额为" + balance);
  }
  else
  {
   System.out.println("余额不足");
  }
 }

 /********************** 只提供Getters,不提供Setters,确保安全 ************************/

 public String getAccountNo()
 {
  return accountNo;
 }

 public double getBalance()
 {
  return balance;
 }
}

 

 

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()
 {
  ac.draw(drawAmount);
 }
}

 

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-12-23 15:04:47

java线程学习5——线程同步之同步方法的相关文章

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线程学习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多线程学习之线程同步

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

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

  模拟一个场景,两个人对同一个账户同时取钱   package cn.xy.Thread; public class Account {  /**   * 账户号   */  private String accountNo;  /**   * 账户余额   */  private double balance;  public Account()  {   super();  }  public Account(String accountNo, double balance)  {   s

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基础学习遇见的问题

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

深入解析Java并发程序中线程的同步与线程锁的使用_java

synchronized关键字 synchronized,我们谓之锁,主要用来给方法.代码块加锁.当某个方法或者代码块使用synchronized时,那么在同一时刻至多仅有有一个线程在执行该段代码.当有多个线程访问同一对象的加锁方法/代码块时,同一时间只有一个线程在执行,其余线程必须要等待当前线程执行完之后才能执行该代码段.但是,其余线程是可以访问该对象中的非加锁代码块的. synchronized主要包括两种方法:synchronized 方法.synchronized 块. synchron

java学习日记(线程)

一.线程的概念: 线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制:但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈.所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小的多,正因如此,线程被称为轻负荷进程(light-weight process).一个进程中可以包含多个线程. 一个线程是一个程序内部的顺序控制流. 1. 进程:每个进程都有独立的代码和数据空间(进程上