多线程,拜大神,锁

90后北京程序员 2013-11-18 05:14:49

public class Demo{
public static int rocket = 20;
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 void run(){
synchronized("11"){
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 void run(){
synchronized("11111"){
while(Demo.rocket>0){

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




结果:
1111卖票,剩余:19张票
22222222卖票,剩余 :18张票.....
1111卖票,剩余:17张票
22222222卖票,剩余 :16张票.....
1111卖票,剩余:15张票
1111卖票,剩余:13张票
22222222卖票,剩余 :14张票.....
1111卖票,剩余:12张票
22222222卖票,剩余 :11张票.....
22222222卖票,剩余 :9张票......
22222222卖票,剩余 :8张票......
1111卖票,剩余:10张票
1111卖票,剩余:6张票
1111卖票,剩余:5张票
22222222卖票,剩余 :7张票......
22222222卖票,剩余 :3张票......
1111卖票,剩余:4张票
1111卖票,剩余:1张票
22222222卖票,剩余 :2张票......
22222222卖票,剩余 :0张票......
1111卖票,剩余:-1张票
为啥结果还有-1啊?怎样解决?
...全文
150 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
谢谢以上回答
ntwarren 2013-11-18
  • 打赏
  • 举报
回复
你两个锁不是同一个锁,不起作用的,要锁同一个对象才行的。
非凡90 2013-11-18
  • 打赏
  • 举报
回复
public class Demo{ public static int rocket = 20; 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 void run(){ synchronized(this){ 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 void run(){ synchronized(this){ while(Demo.rocket>0){ Demo.rocket--; System.out.println("22222222卖票,剩余 :"+Demo.rocket+"张票........"); } } } }
非凡90 2013-11-18
  • 打赏
  • 举报
回复
synchronized(this),就ok了!
seqwait 2013-11-18
  • 打赏
  • 举报
回复
要锁住demo这个对象
package com.xiehou.th;

public class Demo {
	
	public static int rocket = 20;

	public static void main(String[] args) {
		
		Demo demo=new Demo();
		
		MyThread mt1 = new MyThread(demo);
		Thread t1 = new Thread(mt1);
		MyThread2 t2 = new MyThread2(demo);
		t1.start();
		t2.start();
	}
}

class MyThread implements Runnable {
	
	public Demo demo;
	
	public MyThread(Demo demo){
		this.demo=demo;
	}
	
	public void run() {
		synchronized (demo) {
			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 Demo demo;
	
	public MyThread2(Demo demo){
		this.demo=demo;
	}
	
	public void run() {
		synchronized (demo) {
			while (Demo.rocket > 0) {

				Demo.rocket--;
				System.out.println("[2222]第 :" + Demo.rocket + "张票");
			}
		}
	}
}
蟑螂-roach 2013-11-18
  • 打赏
  • 举报
回复
你锁rocket变量,其他线程不就进不去了吗,或者你锁Demo类也行的。你还是看看线程同步吧
  • 打赏
  • 举报
回复
有-1是线程同步现象导致的,判断while条件的时候肯定是满足的,进去执行的时候,另一个线程将Demo.rocket执行的结果为0.所以……

67,512

社区成员

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

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