Java 多线程 竞争造成的异常
来源:互联网 发布:淘宝评语怎么删除 编辑:程序博客网 时间:2024/05/18 17:02
初始状态, 未使用线程同步机制,造成错误。
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]9Thread[Thread-1,5,main]8Thread[Thread-1,5,main]7Thread[Thread-0,5,main]6Thread[Thread-1,5,main]5Thread[Thread-0,5,main]4Thread[Thread-1,5,main]3Thread[Thread-1,5,main]2Thread[Thread-0,5,main]1Thread[Thread-1,5,main]0Exception 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行。
0 0
- Java 多线程 竞争造成的异常
- 多线程锁竞争造成的开销
- java多线程竞争
- 多线程之间的竞争
- java多线程使用不当造成的问题
- Java多线程中的竞争条件、锁以及同步的概念
- JAVA下的多线程程序造成系统时钟变快
- JAVA下的多线程程序造成系统时钟变快
- JAVA下的多线程程序造成系统时钟变快
- Java多线程 -- 多线程的异常捕捉
- 多线程竞争
- java多线程(二)解决共享资源竞争
- JAVA 多线程——线程竞争
- 多线程造成死锁的例子
- Java多线程中异常的处理UncaughtExceptionHandler
- Java多线程——<七>多线程的异常捕捉
- Java多线程系列(3)--解决共享资源竞争synchronized
- java.util.ConcurrentModificationException ,遍历集合并同时修改集合,并发造成的异常解决办法
- Oracle不同表空间之间的数据迁移
- stm32串口通信
- C 字符串排序
- iOS开发之 类目,延展,协议
- 自动滚动的ViewPager
- Java 多线程 竞争造成的异常
- 苹果IOS开发者账号如何续费-Appstore
- 实验八.字符串排序
- 第十五周项目1-哈希表及其运算的实现
- 学习使用Fiddler(一)
- Android Graphics.drawable之—ClipDrawable学习
- Web.XMl中的各种配置
- 室内地图
- 设计模式——创建模式