多线程的问题

90后北京程序员 2013-11-18 11:38:25
public class Demo{
public static int rocket = 21;
public static void main(String[] args){
MyThread mt1 = new MyThread();
Thread t1 = new Thread(mt1);
MyThread2 t2 = new MyThread2();

t1.start();
t2.start();
}
}
class MyThread implements Runnable{
public synchronized void run(){
while(Demo.rocket>0){
if(Demo.rocket==1){
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
}
Demo.rocket--;
System.out.println("1111卖票,剩余:"+Demo.rocket+"张票");

}

}
}
class MyThread2 extends Thread{
public synchronized void run(){

while(Demo.rocket>0){
Demo.rocket--;
System.out.println("22222222卖票,剩余:"+Demo.rocket+"张票........");
}

}
}

看看有啥问题
...全文
213 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ntwarren 2013-11-19
  • 打赏
  • 举报
回复
引用 7 楼 alai_5186_cdsn 的回复:
[quote=引用 4 楼 dyflovexlp 的回复:] 加在方法上的锁,其实是锁住了 MyThread1 和MyThread2 的对象,你要锁住Demo这个才行。 都改为:

public   void run(){
 synchronized(Demo.class){
while(Demo.rocket>0){
Demo.rocket--;
System.out.println("22222222卖票,剩余:"+Demo.rocket+"张票........");
}
}
这样的话,得到的结果是当1111进入的时候,直到111把所有的票都卖光了,2222222也没出来[/quote]

public   void run(){
while(true){
 synchronized(Demo.class){
     if(Demo.rocket>0)
     {
         Demo.rocket--;
         System.out.println("22222222卖票,剩余:"+Demo.rocket+"张票........");
     }
     else
         break;
  }
}
}
  • 打赏
  • 举报
回复
为啥我加了锁但线程结果Demo.rocket的值还是有可能为-1
  • 打赏
  • 举报
回复
什么叫差不多了?
jdgdf566 2013-11-18
  • 打赏
  • 举报
回复
差不多了。。。
  • 打赏
  • 举报
回复
引用 4 楼 dyflovexlp 的回复:
加在方法上的锁,其实是锁住了 MyThread1 和MyThread2 的对象,你要锁住Demo这个才行。 都改为:

public   void run(){
 synchronized(Demo.class){
while(Demo.rocket>0){
Demo.rocket--;
System.out.println("22222222卖票,剩余:"+Demo.rocket+"张票........");
}
}
这样的话,得到的结果是当1111进入的时候,直到111把所有的票都卖光了,2222222也没出来
  • 打赏
  • 举报
回复
4楼正解,你要同步的必须是公共资源,出现-1这种情况,是因为MyThread在Demo.rocket=1的时候,进入了Thread.sleep(1000);而1秒钟的等待时间足够MyThread2进行一次运算,当MyThread2进行while(Demo.rocket>0)的判断的时候MyThread还在睡眠当中,然后MyThread2对Demo.rocket进行了-1.这个时候Demo.rocket已经是0了,当MyThread睡眠结束后,又对他进行了-1就出现-1了,所以你这个程序-1应该都是出现在1111卖的票里。
xuan.ye 2013-11-18
  • 打赏
  • 举报
回复
多线程调用一个方法,和两个线程调用两个方法。 LZ写的是两个方法锁吧?
dyflovexlp 2013-11-18
  • 打赏
  • 举报
回复
加在方法上的锁,其实是锁住了 MyThread1 和MyThread2 的对象,你要锁住Demo这个才行。 都改为:

public   void run(){
 synchronized(Demo.class){
while(Demo.rocket>0){
Demo.rocket--;
System.out.println("22222222卖票,剩余:"+Demo.rocket+"张票........");
}
}

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧