黑马程序员技术交流社区
标题:
为什么只有一个同步锁也会出现死锁情况
[打印本页]
作者:
张振纲
时间:
2012-8-2 00:47
标题:
为什么只有一个同步锁也会出现死锁情况
class Ticket implements Runnable
{
private int num = 100;
public void run()
{
if (num >0)
{
synchronized(this)
{
{
System.out.println(Thread.currentThread().getName()+"....."+num);
num--;
}
}
}
}
}
class SaleTicket
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
//Thread t4 = new Thread(t);
//Thread t5 = new Thread(t);
t1.start();
t2.start();
t3.start();
//t4.start();
//t5.start();
}
}
复制代码
QQ截图20120802004658.png
(6.57 KB, 下载次数: 103)
下载附件
2012-8-2 00:47 上传
作者:
金龙
时间:
2012-8-2 01:45
朋友,
这个并不是死锁,而是你的代码是放在if语句中,并没有循环,后面创建了三个线程,每个线程都只执行一次就结束了,所以结果是100,99,98
public void run()
{
if (num >0)//
这里把if改成while,就好了
{
synchronized(this)
{
{
System.out.println(Thread.currentThread().getName()+"....."+num);
num--;
}
}
}
}
作者:
叶征东
时间:
2012-8-2 02:12
本帖最后由 叶征东 于 2012-8-2 02:32 编辑
class Ticket implements Runnable
{
private int num = 100;
public void run()
{
if (num >0
)
//你这里没有构成循环,只是一个if语句 。所以三个线程各执行完一次之后就不再会执行了,只输出三次不是因为死锁了,而是因为线程执行完了。还有,将 if (num >0)放在 synchronized外面还是会出现安全问题的,因为(num>0)也涉及到num的运算, 所以应将if (num >0)放在synchronized里面。为了构成循环可以在synchronized外加在上while(true),但需手动停止程序,呵.
{
synchronized(this)
{
{
System.out.println(Thread.currentThread().getName()+"....."+num);
num--;
}
}
}
}
}
class SaleTicket
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
//Thread t4 = new Thread(t);
//Thread t5 = new Thread(t);
t1.start();
t2.start();
t3.start();
//t4.start();
//t5.start();
}
}
我将代码改了,可以参考下。
class Ticket implements Runnable
{
private int num = 100;
public void run()
{
while(true)
{
synchronized(this)
{
if (num >0
)
{
System.out.println(Thread.currentThread().getName()+"....."+num);
num--;
}
}
}
}
}
class SaleTicket
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
//Thread t4 = new Thread(t);
//Thread t5 = new Thread(t);
t1.start();
t2.start();
t3.start();
//t4.start();
//t5.start();
}
}
作者:
胡文凡
时间:
2012-8-2 19:49
above is all right
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2