`
wanxiaotao12
  • 浏览: 455989 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java多线程共享数据问题

 
阅读更多

两个人分别用银行卡, 存折同时取钱,

以下是代码,并执行:

public class Test implements Runnable{

 private int account=10;;

 public static void main(String[] args) {

  

  Test t=new Test();

  Thread one=new Thread(t);

  Thread two=new Thread(t);

  one.setName("guolei ");

  two.setName("yunhui ");

  one.start();

  two.start();

 }

 

 @Override

 public void run() {

  // TODO Auto-generated method stub

  for(int x=0;x<1;x++){

   makeWithdrawal(10);

   

  }

 }

 private void makeWithdrawal(int amount){

  

  if(account>=amount){

   

   System.out.println(Thread.currentThread().getName()+"is about to withdraw      "+account);

   try {

    System.out.println(Thread.currentThread().getName()+"is going to sleep         "+account);

    Thread.sleep(500);

   } catch (InterruptedException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

   System.out.println(Thread.currentThread().getName()+"wake up      "+account);

   account-=10;

   System.out.println(Thread.currentThread().getName()+"complete         "+account);

  }

  else{

   System.out.println("sorry   "+Thread.currentThread().getName());

  }

 }

 

 

}

执行结果:guolei is about to withdraw      10

   guolei is going to sleep         10

   yunhui is about to withdraw      10

   yunhui is going to sleep         10

   guolei wake up           10

   guolei complete                  0

   yunhui wake up                   0

   yunhui complete                 -10

结果当yunhui去完钱的时候已经透支了,如何避免这种透支的情况了?我们必须要确保线程一旦进入makeWithdrawal()方法之后,他就必须能够在其他线程

进入之前把任务执行完毕。什么意思了?也就是说我们需要确保线程一旦开始检查检查账户余额,就要能够确定它在其他线程检查余额之前醒来把提款动作

完成。

使用synchronized这个关键词修饰方法可以使它每次只能被单一的线程存取。将此关键字加到方法之后结果就是:

guolei is about to withdraw      10

guolei is going to sleep         10

guolei wake up      10

guolei complete         0

sorry     yunhui

 
分享到:
评论

相关推荐

    使用Java多线程共享数据结构需注意的几个问题.pdf

    #资源达人分享计划#

    java多线程同步问题

    多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!

    Java多线程共享数据、同步、通信

    一、线程共享数据  a)继承Thread,那么我们可以创建很多个这样的类,但是每个这样的类都是相互不关联的,也是说我们Thread类中的内容每个创建出来的类都有一份,因此它不适合作为数据共享的线程来操作。同时由于...

    Java多线程pdf.rar

    部分主要阐述Thread的基础知识,详细介绍线程的API使用、线程安全、线程间数据通信,以及如何保护共享资源等内容,它是深入学习多线程内容的基础

    针对于Executor框架,Java API,线程共享数据

    Executor框架是Java并发编程中的一个重要工具,它提供了一种管理线程池的方式,使得我们可以更方便地管理线程的生命周期和执行线程任务。 原子操作是指不可被...在两个线程之间共享数据,可以通过以下几种方式实现:

    java多线程安全性基础介绍.pptx

    java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...

    Java多线程编程之访问共享对象和数据的方法

    主要介绍了Java多线程编程之访问共享对象和数据的方法,多个线程访问共享对象和数据的方式有两种情况,本文分别给出代码实例,需要的朋友可以参考下

    Java多线程编程 线程同步机制.docx

    线程安全问题的产生是因为多个线程并发访问共享数据造成的,如果能将多个线程对共享数据的并发访问改为串行访问,即一个共享数据同一时刻只能被一个线程访问,就可以避免线程安全问题。锁正是基于这种思路实现的一种...

    Java毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传.rar

    这样可以避免多个线程同时访问共享资源,从而避免数据不一致和其他潜在问题。 4. 基于Http协议:项目使用了Java的HttpURLConnection类来实现基于Http协议的文件下载。这使得项目具有较好的通用性,可以应用于各种...

    java中的多线程内部类实现数据共享和Runnable实现数据共享借鉴.pdf

    java中的多线程内部类实现数据共享和Runnable实现数据共享借鉴.pdf

    java中的多线程内部类实现数据共享和Runnable实现数据共享归类.pdf

    java中的多线程内部类实现数据共享和Runnable实现数据共享归类.pdf

    java多线程资料

    多线程 思索问题解决 ...Java是第一个在语言的核心中支持线程,通过多线程的并发运行提高了系统资源的利用率,改善了系统性能,但由于多线程要共享内存资源,为了避免数据资源的使用混乱,必须对线程的同步问题作出解

    Java编程多线程之共享数据代码详解

    主要介绍了Java编程多线程之共享数据代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    Java多线程安全问题和锁

    多线程安全问题和锁 文章目录多线程安全问题和锁线程在jvm中的特点锁的出现synchronized 关键字-监视器锁monitor lock死锁的产生和避免 什么是线程安全问题? 当多个线程同时操作同一个数据是,可能会出现数据不一样...

    Java多线程大量调用百度地图的搜索功能,来做课程作业数据准备

    Java多线程大量调用百度地图的搜索功能,来做课程作业数据准备 读取xls 采用了apache.poi,说实话,使用体验上来说肯定没有python的pandas还用, 多线程共享资源 主要共享的就是一个sheet对象和访问列标row_number...

    中软卓越Java模拟面试课堂:97-多线程共享数据.pptx

    java

    92道Java多线程与并发面试题含答案(很全)

    一个进程可以包含多个线程,这些线程共享进程的资源。 并发与并行:并发是指多个任务在逻辑上同时发生,而并行是指多个任务在物理上同时发生(例如在多核处理器上)。 同步(Synchronization):同步是控制多个线程...

    Java多线程编程详解

    由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。 由于我们可以通过 private...

    Java多线程编程的优点和缺点

    竞态条件(Race Conditions):多个线程访问共享资源时可能引发竞态条件,导致数据不一致性和程序错误。 死锁(Deadlocks):多线程编程容易出现死锁,即多个线程相互等待对方释放资源的情况,导致程序无法继续执行...

Global site tag (gtag.js) - Google Analytics