java 多线程-可重入锁
发表于:2024-11-26 作者:热门IT资讯网编辑
编辑最后更新 2024年11月26日,可重入锁:锁可以连续使用计数器+判断进入的线程是不是已经锁定的线程,如果是那就不用等待,直接使用public class my {public static void main(String[]arg
可重入锁:锁可以连续使用
计数器+判断进入的线程是不是已经锁定的线程,如果是那就不用等待,直接使用
public class my {public static void main(String[]args){ my m=new my(); m.test();}public void test(){ synchronized(this)//第一次获得锁 { while(true) { synchronized(this)//第二次获得锁,假如没有可重入锁,将会造成死锁 { System.out.println("relock"); } try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}}
手工实现:
public class my {Lock lock=new Lock();public void a() throws InterruptedException{ lock.lock(); System.out.println(lock.getCount()); b(); lock.unlock(); System.out.println(lock.getCount());}public void b() throws InterruptedException{ lock.lock(); System.out.println(lock.getCount()); //.. lock.unlock(); System.out.println(lock.getCount());}public static void main(String[]args) throws InterruptedException{ my m=new my(); m.a(); Thread.sleep(1000); System.out.println(m.lock.getCount());}}class Lock{//是否占用private boolean isLocked=false;private Thread lockedBy=null;//存储线程,如果是自身就不等了private int count=0;//使用锁public synchronized void lock() throws InterruptedException{ Thread t=Thread.currentThread(); while(isLocked&&lockedBy!=t)//如果被锁住了,且不是当前线程 { wait(); } isLocked=true; lockedBy=t; count++;}//释放锁public synchronized void unlock(){ if(Thread.currentThread()==lockedBy) { count--; if(count==0) { isLocked=false; notify(); lockedBy=null; } } isLocked=false; notify();}public int getCount() { return count;}public void setCount(int count) { this.count = count;}}