多线程 互斥共享资源问题

四个线程a,b,c,d。线程a,b对变量i加1。线程c,d对变量i减去1,每个线程每次只执行一次。i的初始值为0,打印结果0121012101.....我写了一个实现方式... 四个线程a,b,c,d。线程a,b对变量i加1。线程c,d对变量i减去1,每个线程每次只执行一次。i的初始值为0, 打印结果0 1 2 1 0 1 2 1 0 1.....
我写了一个实现方式,但虽然能输出:1 2 1 0 1 2 1 0 1....但程序不能正常退出,可能是有线程没有死亡,具体也搞不清,请大伙儿帮看看,程序到底错哪了。代码如下:
class OperateThread implements Runnable{
public int i = 0;
int count = 0;

public void run(){
while(count<20){
synchronized(this){
if(count%4 == 0){
if("Thread_a".equals(Thread.currentThread().getName())){
i++;
count++;
System.out.println(Thread.currentThread().getName() + i);
this.notify();
try{this.wait();}catch(Exception e){}
}
}//else{try{this.wait();}catch(Exception e){}}

if(count%4 == 1){
if("Thread_b".equals(Thread.currentThread().getName())){
i++;
count++;
System.out.println(Thread.currentThread().getName() + i);
this.notify();
try{this.wait();}catch(Exception e){}
}
}//else{try{this.wait();}catch(Exception e){}}

if(count%4 == 2){
if("Thread_c".equals(Thread.currentThread().getName())){
i--;
count++;
System.out.println(Thread.currentThread().getName() + i);
this.notify();
try{this.wait();}catch(Exception e){}
}
}//else{try{this.wait();}catch(Exception e){}}

if(count%4 ==3){
if("Thread_d".equals(Thread.currentThread().getName())){
i--;
count++;
System.out.println(Thread.currentThread().getName() + i);
this.notify();
try{this.wait();}catch(Exception e){}
}
}//else{try{this.wait();}catch(Exception e){}}
}
}
}
}

public class ThreadLockTest2{
public static void main(String[] args){
OperateThread ot = new OperateThread();
new Thread(ot,"Thread_a").start();
new Thread(ot,"Thread_b").start();
new Thread(ot,"Thread_c").start();
new Thread(ot,"Thread_d").start();
}
}
展开
 我来答
百度网友559f8d3
2014-03-17 · TA获得超过203个赞
知道小有建树答主
回答量:157
采纳率:0%
帮助的人:54.5万
展开全部
1)你的共享变量没有加上volatile关键字,有可能出错。
2)多线程设计基本上这种就是错误的,完全是靠计算机计算能力试出来的结果,你不应该用这种造型的通知机制,具体多看看wait/notify的例子。
3)没有结束的原因是因为最后一个线程还处于wait状态。wait改为这样就可以了:
if(count<20)//在wait之前判断一下。这种限制最后一次的count值肯定会是21在循环体里面跑,
{
try{this.wait();}catch(Exception e){}
}
4)count从字面意思是不希望大于20,实际效果不是这样,因为先判断后锁的原因,这种情况,简单的一般可以用DOUBLE CHECK的机制来解决。
浙江启扬智能科技有限公司
2023-06-12 广告
Android和ARM、Linux之间存在密切的联系。Android是一种基于Linux内核的嵌入式智能操作系统,它采用了ARM处理器作为其主要处理器架构。Android的内核和许多应用程序都是基于ARM架构编写的,包括处理器和内存管理器。... 点击进入详情页
本回答由浙江启扬智能科技有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式