Java多线程死锁的问题
classTicketimplementsRunnable{privateinttick=100;Objectobj=newObject();booleanflag=tr...
class Ticket implements Runnable
{
private int tick = 100;
Object obj = new Object();
boolean flag = true;
public void run(){
if(flag){
while(true){
synchronized(obj){ //obj锁
show();
}
}
}else{
while(true)
show();
}
}
public synchronized void show(){ //this锁
synchronized(obj){ //obj锁
if(tick>0){
try{
Thread.sleep(10);
}catch(Exception e){
}
System.out.println(Thread.currentThread().getName()+"code.........:"+tick--);
}
}
}
}
class DeadLockDemo
{
public static void main(String[] args){
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
try{Thread.sleep(10);}catch(Exception e){}
t.flag = false;
t2.start();
}
}
我想问一下,什么情况下是this锁,函数上的锁就一定是this锁是么?代码块的锁呢?
另外上面的程序会出现死锁,为什么?t1和t2都在调用show(),那t1执行show的时候t2应该执行不了啊,锁应该锁上了啊,怎么会出现死锁呢?
本人菜鸟,线程同步这个地方学的很吃力,希望讲解的能详细一点 展开
{
private int tick = 100;
Object obj = new Object();
boolean flag = true;
public void run(){
if(flag){
while(true){
synchronized(obj){ //obj锁
show();
}
}
}else{
while(true)
show();
}
}
public synchronized void show(){ //this锁
synchronized(obj){ //obj锁
if(tick>0){
try{
Thread.sleep(10);
}catch(Exception e){
}
System.out.println(Thread.currentThread().getName()+"code.........:"+tick--);
}
}
}
}
class DeadLockDemo
{
public static void main(String[] args){
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
try{Thread.sleep(10);}catch(Exception e){}
t.flag = false;
t2.start();
}
}
我想问一下,什么情况下是this锁,函数上的锁就一定是this锁是么?代码块的锁呢?
另外上面的程序会出现死锁,为什么?t1和t2都在调用show(),那t1执行show的时候t2应该执行不了啊,锁应该锁上了啊,怎么会出现死锁呢?
本人菜鸟,线程同步这个地方学的很吃力,希望讲解的能详细一点 展开
展开全部
代码已修改,可能出现的问题,(1)sleep时间过短,线程2还没启动,票已卖完
(2)两个while是死循环,票卖完了没退出
(3)死锁的原因怀疑是两个Obj锁的冲突,可能是两个线程各拿到一个锁,均没有解锁机制,所以我删除了show方法中的obj锁
class Ticket implements Runnable
{
Object obj = new Object();
boolean flag = true;
{
while(tick>0)
{
synchronized(obj) //obj锁
{
show();
}
}
}
else
{
while(tick>0)show();
}
}
public synchronized void show(){ //this锁
if(tick>0){
try{
Thread.sleep(100);
}catch(Exception e){
}
System.out.println(Thread.currentThread().getName()+"code.........:"+tick--);
}
}
}
public class DeadLockDemo
{
public static void main(String[] args){
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
try{Thread.sleep(10);}catch(Exception e){}
t.flag = false;
t2.start();
}
}
更多追问追答
追问
?。。我不是让你解决掉死锁。。我是问为什么会出现死锁- -
追答
已修改,你看看
展开全部
其实说实话你用了很多重的锁,以至于根本不知道哪里死锁,同步标志你用了数次,synchronized这个关键字一般是叫做同步块,也就是在这个关键字里面的方法或者代码块只能每次有一个线程进入,实在不了解你所说的this锁,一般情况下加锁有额外的语句,上边的关键字一般用于同步,请看java编程思想的多线程章节。
package test;
class Ticket implements Runnable
{
private int tick = 100;
Object obj = new Object();
boolean flag = true;
public void run(){
if(flag){
while(true){
//synchronized(Ticket.this){ //obj锁
show();
// }
}
}else{
while(true)
show();
}
}
public synchronized
void show(){ //this锁
// synchronized(obj){ //obj锁
if(tick>0){
try{
Thread.sleep(10);
}catch(Exception e){
}
System.out.println(Thread.currentThread().getName()+"code.........:"+tick--);
// }
}
}
}
class DeadLockDemo
{
public static void main(String[] args){
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
/*try{
Thread.sleep(10);
}
catch(Exception e){}*/
//t.flag = false;
t2.start();
}
}
追问
已经明白了,谢谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
已经测试过,上面的代码不会发生死锁。所以你的问题还是重新问吧
再试一遍,居然又死锁了
再试一遍,居然又死锁了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询