zoukankan      html  css  js  c++  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() : 当前线程等待其它线程结束
  • 相关阅读:
    python-day1
    go 字符串方法
    str,转换int,相互
    go 文件打包上传本地测试环境
    通联收银宝,官方文档
    go uuid
    go xid
    golang decimal处理插件包 大数字处理
    图像处理 bimg
    golang strings,常用函数
  • 原文地址:https://www.cnblogs.com/nadou/p/13984666.html
Copyright © 2011-2022 走看看