• 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() : 当前线程等待其它线程结束
  • 相关阅读:
    三联生活周刊:女游戏设计师之死
    HTML
    营运社区所需要的基本心理学常识
    对C++下struct 和 类默认继承的认识
    什么是列表?
    什么是个人网站?
    DevExpress ASPxListBox can't get selected items after postback
    ListItemEventHandler does not fire on the prospective list
    SPF和SharePoint Server的区别
    什么是网站?
  • 原文地址:https://www.cnblogs.com/nadou/p/13984666.html
Copyright © 2020-2023  润新知