java线程死锁

    xiaoxiao2021-03-25  76

    public class Study extends Thread{ private Counter counter; public Study(Counter counter){ this.counter=counter; start(); } @Override public void run() { for(int i=0;i<100;i++){ counter.add(); } } public static void main(String[] args) { Counter counter1=new Counter(); Counter counter2=new Counter(); counter1.setFriend(counter2); counter2.setFriend(counter1); Study study1=new Study(counter1); Study study2=new Study(counter2); } } class Counter{ private int a; private Counter friend; public void setFriend(Counter counter){ this.friend=counter; } public synchronized void add(){ a++; Thread.yield(); friend.delete(); System.out.println(Thread.currentThread().getName()+":add"); } public synchronized void delete(){ a--; System.out.println(Thread.currentThread().getName()+":delete"); } }

    分析:

    首先study1线程进入run方法,获得counter1对象的锁,执行counter1的add方法,然后study1让出cpu执行权,则study2线程进入run方法,获得counter2对象的锁,执行counter2的add方法,之后study2让出cpu执行权,则study1进入运行状态,想执行counter2的delete方法,但是counter2对象锁已经被study2获得,而且如果后面study2线程进入运行状态,study2也要执行counter1delete方法,但是counter1对象锁已经被study1获得,这样就是导致了死锁。

    转载请注明原文地址: https://ju.6miu.com/read-24871.html

    最新回复(0)