java 多线程-可重入锁

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 多线程-可重入锁相关的知识,希望对你有一定的参考价值。

可重入锁:锁可以连续使用
计数器+判断进入的线程是不是已经锁定的线程,如果是那就不用等待,直接使用

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;


以上是关于java 多线程-可重入锁的主要内容,如果未能解决你的问题,请参考以下文章

可重入锁 自旋锁,看这一篇就够了!

Java中锁分类

6.23Java多线程可重入锁实现原理

java 多线程-可重入锁

Java 独占锁与共享锁公平锁与非公平锁可重入锁

多线程之synchronoized实现可重入锁