Java 多线程 竞争造成的异常 刺骨的言语ヽ痛彻心扉 2022-08-18 02:57 130阅读 0赞 初始状态, 未使用线程同步机制,造成错误。 package com.kunpengku; import java.util.Random; import java.util.Stack; public class Welcome { public static Stack<Integer> abc = new Stack(); public static void main(String[] args) throws Exception { for (int i=0;i<10;i++){ abc.push(i); } //多线程方式 Q q = new Q(); Q q2 = new Q(); q.start(); q2.start(); } } class Q extends Thread{ public static Stack<Integer> abc; Q(){ this.abc = Welcome.abc; } public void run(){ try{ while(this.abc.size()>0){ Random random = new Random(); Thread.sleep(random.nextInt(1000)); int tmp = abc.pop(); System.out.println(Thread.currentThread() + String.valueOf(tmp)); } }catch(InterruptedException e){ e.printStackTrace(); } } } 终端输出 Thread[Thread-0,5,main]9 Thread[Thread-1,5,main]8 Thread[Thread-1,5,main]7 Thread[Thread-0,5,main]6 Thread[Thread-1,5,main]5 Thread[Thread-0,5,main]4 Thread[Thread-1,5,main]3 Thread[Thread-1,5,main]2 Thread[Thread-0,5,main]1 Thread[Thread-1,5,main]0 Exception in thread "Thread-0" java.util.EmptyStackException at java.util.Stack.peek(Unknown Source) at java.util.Stack.pop(Unknown Source) at com.kunpengku.Q.run(Welcome.java:38) 解决方法 利用Lock 线程锁 package com.kunpengku; import java.util.Random; import java.util.Stack; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Welcome { public static Stack<Integer> abc = new Stack(); public static void main(String[] args) throws Exception { for (int i=0;i<10;i++){ abc.push(i); } //多线程方式二 Q q = new Q(); Q q2 = new Q(); q.start(); q2.start(); } } class Q extends Thread{ public static Stack<Integer> abc; private static Lock lock = new ReentrantLock(); Q(){ this.abc = Welcome.abc; } public void run(){ lock.lock(); try{ while(this.abc.size()>0){ Random random = new Random(); Thread.sleep(random.nextInt(1000)); int tmp = abc.pop(); System.out.println(Thread.currentThread() + String.valueOf(tmp)); } }catch(InterruptedException e){ e.printStackTrace(); }finally{ lock.unlock(); } } } 主要增加了 30, 36, 48行。
相关 多线程并发控制:如何避免Java多线程中的数据竞争? 在Java多线程中,数据竞争是常见的问题,可能会导致数据的不一致。以下是几种避免数据竞争的方法: 1. **synchronized关键字**: 使用`synchron 水深无声/ 2024年09月16日 06:03/ 0 赞/ 9 阅读
相关 Java多线程并发中的锁竞争现象 锁竞争现象是Java多线程编程中常见的问题,特别是在高并发场景下。 锁竞争是指多个线程同时获取同一把锁,但由于锁的独占性,只有一个线程能持有并释放锁,这就导致了其他线程可能长 古城微笑少年丶/ 2024年09月10日 04:33/ 0 赞/ 18 阅读
相关 减少多线程竞争的技术 目的 减少多线程竞争是为了提高程序的性能和避免因为竞争导致的性能下降或死锁等问题。 常见方法 1. 无锁算法 使用无锁算法,如CAS(Compare and 港控/mmm°/ 2024年02月05日 11:43/ 0 赞/ 13 阅读
相关 java多线程使用不当造成的问题 下面的thread dump是在CPU使用高的情况下采集的jstack的数据。 "pool-19-thread-50" prio=10 tid=0x00007fd1b8 水深无声/ 2022年08月23日 03:52/ 0 赞/ 151 阅读
相关 Java 多线程 竞争造成的异常 初始状态, 未使用线程同步机制,造成错误。 package com.kunpengku; import java.util.Random; 刺骨的言语ヽ痛彻心扉/ 2022年08月18日 02:57/ 0 赞/ 131 阅读
相关 多线程之间的竞争 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁。 对代码进行同步控制我们可以选择同步方法,也可以选择同步块,这两种方式各有优缺点,至于 蔚落/ 2022年08月07日 09:45/ 0 赞/ 140 阅读
相关 多线程竞争 在多线程编程中,会经常碰到资源竞争的情况,如果多个线程同时访问同个资源,会照成未知的错误。 如以下实例代码,多个线程对同个全局变量进行加1操作,得到的结果并 男娘i/ 2022年08月04日 08:42/ 0 赞/ 137 阅读
相关 Java多线程--竞争条件 竞争条件: Java多线程中多个线程对同一数据进行存取操作,可能出现某一线程尚未完成对该数据的操作,而另一线程又对该数据进行操作,造成了数据错误。 竞争条件产生的原因是 喜欢ヅ旅行/ 2022年05月30日 06:48/ 0 赞/ 239 阅读
相关 条件竞争实验-多线程竞争访问 目录 案例 实验步骤 总结 > 条件竞争的原理是没有对临界资源(共享变量)实现互斥访问,这就可能导致多线程访问时出现结果的不可再 深碍√TFBOYSˉ_/ 2021年09月21日 10:02/ 0 赞/ 284 阅读
还没有评论,来说两句吧...