java死锁

//继上篇文章java中多线程同步函数this锁的证明以及静态同步函数的锁之后,这里写一个多线程的死锁,思路是每个线程总共用两把锁,开始时第一个线程用第一把锁紧接着用第二把锁,第二个线程用第二把锁然后紧接着用第一把锁,这样但凡有一个线程没有释放锁,此时程序就产生了死锁。见代码:

package Thread01;

class Thread02 implements Runnable{

    private static int countTicket = 100;
    private static Object obj = new Object();
    public static boolean flag = true;
    @Override
    public void run() {

        if(flag){//使用同步锁--this
            while(countTicket>0){
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                sale1();
            }
        }else{//使用同步函数
            while(countTicket>0){
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                sale();
            }
        }

    }

    public void sale1(){

        synchronized(obj){
            synchronized (this) {
            	if(countTicket>0){ //------当把这个if判断去掉 最后还是会有两个线程来争夺最后一张票 会挨个执行,数据不会出错,但是逻辑会出错。
                    System.out.println("当前线程名字:"+Thread.currentThread().getName()+";出售第"+(100 - countTicket + 1)+"张票。");
                    countTicket--;
			}
         }
        }
    }

    public synchronized void sale(){

        synchronized (obj) {
        	if(countTicket>0){
                //卖票
                System.out.println("当前线程名字:"+Thread.currentThread().getName()+";出售第"+(100 - countTicket + 1)+"张票。");
                countTicket--;
            }
		}

    }
}

public class ThreadDemo {

    public static void main(String[] args) throws InterruptedException {
        Thread02 t = new Thread02();

        Thread t1 = new Thread(t,"窗口1");
        Thread t2 = new Thread(t,"窗口2");
        t1.start();
        Thread.sleep(50);
        Thread02.flag=false;
        t2.start();
    }

}

//当然这里用的任然时上篇博客的代码这里要注意,我CountTicket总数为100,有可能碰到在这所有票数都售出都不发生死锁,也有可能售出第二章就产生死锁,这里注意一下。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值