java中死锁,Java—死锁

一、死锁

同步锁使用的弊端:当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步。这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁。

public class DeadLockTest {

public static void main(String[] args) {

DeadLock deadLock = new DeadLock();

Thread t1 = new Thread(deadLock);

Thread t2 = new Thread(deadLock);

t1.start();

t2.start();

}

}

class DeadLock implements Runnable{

int x = new Random().nextInt(1);//0,1

Object lockA = new Object();

Object lockB = new Object();

@Override

public void run() {

while(true){

if(x % 2 == 0){

synchronized (lockA) {

System.out.println("if-lockA");

synchronized (lockB) {

System.out.println("if-lockB");

System.out.println("if-大口吃肉");

}

}

}else{

synchronized (lockB) {

System.out.println("else-lockB");

synchronized (lockA) {

System.out.println("else-lockA");

System.out.println("else-大口吃肉");

}

}

}

x++;

}

}

}

二、等待唤醒机制

线程之间的通信:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同。通过一定的手段使各个线程能有效的利用资源。而这种手段即—— 等待唤醒机制。

wait() : 等待,将正在执行的线程释放其执行资格和执行权,并存储到线程池中。

notify():唤醒,唤醒线程池中被wait()的线程,一次唤醒一个,而且是任意的。

notifyAll(): 唤醒全部:可以将线程池中的所有wait() 线程都唤醒。

所谓唤醒的意思就是让 线程池中的线程具备执行资格。必须注意的是,以上方法都是在同步中才有效。同时这些方法在使用时必须标明所属锁,这样才可以明确出这些方法操作的到底是哪个锁上的线程。

join() : 当前线程等待其它线程结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值