两个人分别用银行卡, 存折同时取钱,
以下是代码,并执行:
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
相关推荐
#资源达人分享计划#
多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!
一、线程共享数据 a)继承Thread,那么我们可以创建很多个这样的类,但是每个这样的类都是相互不关联的,也是说我们Thread类中的内容每个创建出来的类都有一份,因此它不适合作为数据共享的线程来操作。同时由于...
部分主要阐述Thread的基础知识,详细介绍线程的API使用、线程安全、线程间数据通信,以及如何保护共享资源等内容,它是深入学习多线程内容的基础
Executor框架是Java并发编程中的一个重要工具,它提供了一种管理线程池的方式,使得我们可以更方便地管理线程的生命周期和执行线程任务。 原子操作是指不可被...在两个线程之间共享数据,可以通过以下几种方式实现:
java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...
主要介绍了Java多线程编程之访问共享对象和数据的方法,多个线程访问共享对象和数据的方式有两种情况,本文分别给出代码实例,需要的朋友可以参考下
线程安全问题的产生是因为多个线程并发访问共享数据造成的,如果能将多个线程对共享数据的并发访问改为串行访问,即一个共享数据同一时刻只能被一个线程访问,就可以避免线程安全问题。锁正是基于这种思路实现的一种...
这样可以避免多个线程同时访问共享资源,从而避免数据不一致和其他潜在问题。 4. 基于Http协议:项目使用了Java的HttpURLConnection类来实现基于Http协议的文件下载。这使得项目具有较好的通用性,可以应用于各种...
java中的多线程内部类实现数据共享和Runnable实现数据共享借鉴.pdf
java中的多线程内部类实现数据共享和Runnable实现数据共享归类.pdf
多线程 思索问题解决 ...Java是第一个在语言的核心中支持线程,通过多线程的并发运行提高了系统资源的利用率,改善了系统性能,但由于多线程要共享内存资源,为了避免数据资源的使用混乱,必须对线程的同步问题作出解
主要介绍了Java编程多线程之共享数据代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
多线程安全问题和锁 文章目录多线程安全问题和锁线程在jvm中的特点锁的出现synchronized 关键字-监视器锁monitor lock死锁的产生和避免 什么是线程安全问题? 当多个线程同时操作同一个数据是,可能会出现数据不一样...
Java多线程大量调用百度地图的搜索功能,来做课程作业数据准备 读取xls 采用了apache.poi,说实话,使用体验上来说肯定没有python的pandas还用, 多线程共享资源 主要共享的就是一个sheet对象和访问列标row_number...
java
一个进程可以包含多个线程,这些线程共享进程的资源。 并发与并行:并发是指多个任务在逻辑上同时发生,而并行是指多个任务在物理上同时发生(例如在多核处理器上)。 同步(Synchronization):同步是控制多个线程...
由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。 由于我们可以通过 private...
竞态条件(Race Conditions):多个线程访问共享资源时可能引发竞态条件,导致数据不一致性和程序错误。 死锁(Deadlocks):多线程编程容易出现死锁,即多个线程相互等待对方释放资源的情况,导致程序无法继续执行...