线程死锁: (一)死锁的定义: 第一个线程在等待第二个线程占有的某个对象锁,同时第二个线程也在等待第一个线程占有的对象锁。由于每个线程都在等待其他线程来释放锁,导致了线程一直等待下去。 (二)死锁的充要条件: (1)互斥:某一个资源在同一时刻,只能由一个线程占有。 (2)非抢占:一个线程不可以抢占另一个线程占有的资源; (3)占有并等待:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 (4)循环等待:多个进程之间形成一种头尾相接的循环等待资源关系。 (四)死锁的范例: 分析:通常是一个线程占有了资源A,而又想去锁定资源B;在另一个线程中,占有了资源B,而又想去锁定资源A以完成自身的操作,两个线程都想得到对方的资源,而不愿释放自己的资源,造成两个线程都在等待,而无法执行的情况。 /** *PrintNum.java * Created on 5:18:04 PM Feb 22, 2009 *@author Quasar063501 *@version 0.1 * */ public class PrintNum { private byte[] lock = new byte[0]; //自定义锁对象,这样代价最小,也可已使用当前对象this public void demo() { PrintThread a = new PrintThread("a"); PrintThread b = new PrintThread("b"); a.start(); b.start(); } class PrintThread extends Thread { public PrintThread(String name) { this.setName(name); } public void run() { synchronized(lock) { for(int i =0; i < 100; i++) { if(i % 10 == 0 && 0 != i) { try { lock.wait(); //暂时释放资源 lock.notify(); //唤醒另外一个进程 } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(this.getName()+": "+i); } } } } } 这个程序最终会因为互相唤醒而死锁。 分析:线程a先获得对象的锁,线程b等待,然后a打印0——9,当i=10时,线程a调用对象锁的wait,释放锁,同时a等待; 由于a已经释放掉了锁,所以a不可以执行下面的notify函数了。所以此时b也没有被唤醒。 -------------- 死锁范例二: package com.damlab.fz; public class DeadLock { public static void main(String[] args) { Resource r1= new Resource(); Resource r2= new Resource(); //每个线程都拥有r1,r2两个对象 Thread myTh1 = new MyThread1(r1,r2); Thread myTh2 = new MyThread2(r1,r2); myTh1.start(); myTh2.start(); } } class Resource{ private int i; } class MyThread1 extends Thread{ private Resource r1,r2; public MyThread1(Resource r1, Resource r2) { this.r1 = r1; this.r2 = r2; } @Override public void run() { while(true){ //先获得r1的锁,再获得r2的锁 synchronized (r1) { System.out.println("1号线程获取了r1的锁"); synchronized (r2) { System.out.println("1号线程获取了r2的锁"); } } } } } class MyThread2 extends Thread{ private Resource r1,r2; public MyThread2(Resource r1, Resource r2) { this.r1 = r1; this.r2 = r2; } @Override public void run() { while(true){ //先获得r2的锁,再获得r1的锁 synchronized (r2) { System.out.println("2号线程获取了r2的锁"); synchronized (r1) { System.out.println("2号线程获取了r1的锁"); } } } } }
java死锁的线程,java线程死锁
最新推荐文章于 2024-07-08 13:10:53 发布