关于多线程同步的问题 高数请进

a453940712 2013-04-03 04:48:00
public class ticketTread implements Runnable{

static boolean flag=true;
int count=200;
public void run()
{


while(flag&&count>=0)
{
synchronized(this)
{

System.out.println("这是"+Thread.currentThread().getName()+"在卖"+count+"张票");
count--;

}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


}
public static void safeStop()
{

flag=false;

}


}



import java.io.IOException;


public class ticketDemo {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ticketTread tr=new ticketTread();
Thread t1=new Thread(tr);
Thread t2=new Thread(tr);
Thread t3=new Thread(tr);
Thread t4=new Thread(tr);
t1.start();
t2.start();
t3.start();
t4.start();
//阻塞
try {
System.in.read();
ticketTread.safeStop();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}
// 结果打印出了

...全文
385 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
摆烂办不到 2013-04-12
  • 打赏
  • 举报
回复
我的想法和9楼一样 呵呵
摆烂办不到 2013-04-12
  • 打赏
  • 举报
回复
呵呵,楼主synchronized地方放错了才导致这个打印出负数的问题的,首先说明下楼主的代码中
while(flag&&count>=0)
{
/*synchronized放在while循环体的内部,假设当前线程是t1,执行到count == 0时 while执行完但还未进入到synchronized块的时候可能会被其他线程抢占此资源 假设是t2,执行run()方法打印出count == 0,然后count-- ,此时count == -1,但此时对于t1来说while语句已经判断了!所以对于t1来说它会直接调用System.out.println()方法,打印的却是count为-1时的语句*/
synchronized(this)
正确的解决办法是将synchronized(this)放在while语句之外,至于为什么,请楼主自己思考。
lihoujun123 2013-04-12
  • 打赏
  • 举报
回复
其实这个问题比较简单,就是判断完count>0之后count还有可能改变,就有可能小于0了。比如此时count=0 第一个线程执行到System.out.println("这是"+Thread.currentThread().getName()+"在卖"+count+"张票");第二个线程执行到
while(flag&&count>=0)此时满足条件遇到锁第二个线程等待,继续执行第一个线程count--,此时count为-1,然后第二个线程抢到资源执行输出语句,但此时count为-1了,所以就错了。解决方法就是把while语句也锁进去,或在进行一次判别。
希望能帮助楼主
elli_son 2013-04-12
  • 打赏
  • 举报
回复
the right answer~
引用 4 楼 lye2000000_super 的回复:
引用 2 楼 Kanepan 的回复:double check就可以了 Java code?12345678910111213141516171819public void run() { while (flag && count >= 0) { synchronized (this) { ……
anzhilin 2013-04-04
  • 打赏
  • 举报
回复
找本操作系统的书来看看 或者<<java并发编程实战>> 这是很简单的问题
a453940712 2013-04-03
  • 打赏
  • 举报
回复
引用 3 楼 is_zhoufeng 的回复:
将while循环放进同步块内, 但是要将sleep() 改成wait()方法,因为sleep不会释放锁,wait方法会释放锁。避免线程不能交替运行。 并且将wait方法放进while循环内。 修改run方法为: Java code?123456789101112131415161718192021public void run() { sync……
为什么要再加上判断呢??
a453940712 2013-04-03
  • 打赏
  • 举报
回复
引用 2 楼 Kanepan 的回复:
double check就可以了 Java code?12345678910111213141516171819public void run() { while (flag && count >= 0) { synchronized (this) { if(count >= 0){ ……
为什么要加第二个控制if(count>=0) 第一个控制不住么??
  • 打赏
  • 举报
回复
引用 2 楼 Kanepan 的回复:
double check就可以了 Java code?12345678910111213141516171819public void run() { while (flag && count >= 0) { synchronized (this) { if(count >= 0){ ……
正解。。。等待的时候,,count很可能已经改变了。。。
_jerrytiger 2013-04-03
  • 打赏
  • 举报
回复
将while循环放进同步块内, 但是要将sleep() 改成wait()方法,因为sleep不会释放锁,wait方法会释放锁。避免线程不能交替运行。 并且将wait方法放进while循环内。 修改run方法为:

public void run()
	{


		synchronized(this)
		{
			while(flag&&count>=0)
			{
				
				System.out.println("这是"+Thread.currentThread().getName()+"在卖"+count+"张票");
				count--;
				try {
					this.wait(10);  
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}


	}

或者在同步块内再加上判断。

public void run()
	{


		while(flag&&count>=0)
		{
			synchronized(this)
			{
				if(flag&&count>=0){	//这里再加上判断
					System.out.println("这是"+Thread.currentThread().getName()+"在卖"+count+"张票");
					count--;
				}else{
					return ;
				}

			}
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block  
				e.printStackTrace();
			}
		}


	}
Kanepan 2013-04-03
  • 打赏
  • 举报
回复
double check就可以了

		public void run() {

			while (flag && count >= 0) {
				synchronized (this) {
					if(count >= 0){
						System.out.println("这是" + Thread.currentThread().getName()
								+ "在卖" + count + "张票");
						count--;
					}
				}
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

		}


a453940712 2013-04-03
  • 打赏
  • 举报
回复
怎么会有负数呢??

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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