• 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() : 当前线程等待其它线程结束
  • 相关阅读:
    学习进度条--第十四周
    第二次团队冲刺--9
    第二次团队冲刺--8
    课堂练习--最少花费的购买书籍
    第二次团队冲刺--7
    第二次团队冲刺--6
    第二次团队冲刺--5
    软工第四周进度表
    软工第四周过程总结
    个人作业之二柱子四则运算2升级版
  • 原文地址:https://www.cnblogs.com/nadou/p/13984666.html
Copyright © 2020-2023  润新知