Java中可重入锁的基本概念是什么?
- 内容介绍
- 文章标签
- 相关推荐
本文共计854个文字,预计阅读时间需要4分钟。
本文简要介绍了Java中的可重入锁。通过示例代码展示了其基本用法,内容较为简洁,适合对可重入锁有一定了解的学习者或工作者参考。需要的伙伴可参考以下内容:
可重入锁简介
可重入锁,又称递归锁,是一种特殊的互斥锁。它允许同一个线程多次获取同一把锁,而不会导致死锁。
示例代码
javapublic class ReentrantLockExample { private final ReentrantLock lock=new ReentrantLock();
public void method1() { lock.lock(); try { method2(); } finally { lock.unlock(); } }
public void method2() { lock.lock(); try { // 方法2的代码 } finally { lock.unlock(); } }}
学习价值
对于学习者和工作者来说,了解可重入锁具有一定的参考价值。它可以帮助我们更好地理解Java中的同步机制,提高代码的健壮性和效率。
参考文献
- Java并发编程实战- Java并发编程之美
这篇文章主要介绍了简单了解Java中的可重入锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock。
可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。
在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁。
下面是使用实例:
package reentrantLock; public class Test implements Runnable{ public synchronized void get(){ System.out.println(Thread.currentThread().getId()); set(); } public synchronized void set(){ System.out.println(Thread.currentThread().getId()); } @Override public void run() { get(); } public static void main(String[] args) { Test ss=new Test(); new Thread(ss).start(); new Thread(ss).start(); new Thread(ss).start(); } }
运行截图:
package reentrantLock; import java.util.concurrent.locks.ReentrantLock; public class Test implements Runnable { ReentrantLock lock = new ReentrantLock(); public void get() { lock.lock(); System.out.println(Thread.currentThread().getId()); set(); lock.unlock(); } public void set() { lock.lock(); System.out.println(Thread.currentThread().getId()); lock.unlock(); } @Override public void run() { get(); } public static void main(String[] args) { Test ss = new Test(); new Thread(ss).start(); new Thread(ss).start(); new Thread(ss).start(); } }
可重入锁最大的作用是避免死锁
我们以自旋锁作为例子,
public class SpinLock { private AtomicReference<Thread> owner =new AtomicReference<>(); public void lock(){ Thread current = Thread.currentThread(); while(!owner.compareAndSet(null, current)){ } } public void unlock (){ Thread current = Thread.currentThread(); owner.compareAndSet(current, null); } }
对于自旋锁来说,
1、若有同一线程两调用lock() ,会导致第二次调用lock位置进行自旋,产生了死锁说明这个锁并不是可重入的。(在lock函数内,应验证线程是否为已经获得锁的线程)
2、若1问题已经解决,当unlock()第一次调用时,就已经将锁释放了。实际上不应释放锁。(采用计数次进行统计)修改之后,如下:
public class SpinLock1 { private AtomicReference<Thread> owner =new AtomicReference<>(); private int count =0; public void lock(){ Thread current = Thread.currentThread(); if(current==owner.get()) { count++; return ; } while(!owner.compareAndSet(null, current)){ } } public void unlock (){ Thread current = Thread.currentThread(); if(current==owner.get()){ if(count!=0){ count--; }else{ owner.compareAndSet(current, null); } } } }
该自旋锁即为可重入锁。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。
本文共计854个文字,预计阅读时间需要4分钟。
本文简要介绍了Java中的可重入锁。通过示例代码展示了其基本用法,内容较为简洁,适合对可重入锁有一定了解的学习者或工作者参考。需要的伙伴可参考以下内容:
可重入锁简介
可重入锁,又称递归锁,是一种特殊的互斥锁。它允许同一个线程多次获取同一把锁,而不会导致死锁。
示例代码
javapublic class ReentrantLockExample { private final ReentrantLock lock=new ReentrantLock();
public void method1() { lock.lock(); try { method2(); } finally { lock.unlock(); } }
public void method2() { lock.lock(); try { // 方法2的代码 } finally { lock.unlock(); } }}
学习价值
对于学习者和工作者来说,了解可重入锁具有一定的参考价值。它可以帮助我们更好地理解Java中的同步机制,提高代码的健壮性和效率。
参考文献
- Java并发编程实战- Java并发编程之美
这篇文章主要介绍了简单了解Java中的可重入锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock。
可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。
在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁。
下面是使用实例:
package reentrantLock; public class Test implements Runnable{ public synchronized void get(){ System.out.println(Thread.currentThread().getId()); set(); } public synchronized void set(){ System.out.println(Thread.currentThread().getId()); } @Override public void run() { get(); } public static void main(String[] args) { Test ss=new Test(); new Thread(ss).start(); new Thread(ss).start(); new Thread(ss).start(); } }
运行截图:
package reentrantLock; import java.util.concurrent.locks.ReentrantLock; public class Test implements Runnable { ReentrantLock lock = new ReentrantLock(); public void get() { lock.lock(); System.out.println(Thread.currentThread().getId()); set(); lock.unlock(); } public void set() { lock.lock(); System.out.println(Thread.currentThread().getId()); lock.unlock(); } @Override public void run() { get(); } public static void main(String[] args) { Test ss = new Test(); new Thread(ss).start(); new Thread(ss).start(); new Thread(ss).start(); } }
可重入锁最大的作用是避免死锁
我们以自旋锁作为例子,
public class SpinLock { private AtomicReference<Thread> owner =new AtomicReference<>(); public void lock(){ Thread current = Thread.currentThread(); while(!owner.compareAndSet(null, current)){ } } public void unlock (){ Thread current = Thread.currentThread(); owner.compareAndSet(current, null); } }
对于自旋锁来说,
1、若有同一线程两调用lock() ,会导致第二次调用lock位置进行自旋,产生了死锁说明这个锁并不是可重入的。(在lock函数内,应验证线程是否为已经获得锁的线程)
2、若1问题已经解决,当unlock()第一次调用时,就已经将锁释放了。实际上不应释放锁。(采用计数次进行统计)修改之后,如下:
public class SpinLock1 { private AtomicReference<Thread> owner =new AtomicReference<>(); private int count =0; public void lock(){ Thread current = Thread.currentThread(); if(current==owner.get()) { count++; return ; } while(!owner.compareAndSet(null, current)){ } } public void unlock (){ Thread current = Thread.currentThread(); if(current==owner.get()){ if(count!=0){ count--; }else{ owner.compareAndSet(current, null); } } } }
该自旋锁即为可重入锁。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

