ReentrantLock重入锁
Posted mature1021
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ReentrantLock重入锁相关的知识,希望对你有一定的参考价值。
import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.locks.ReentrantLock; /** * 可重入锁: 也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。 在JAVA中ReentrantLock 和synchronized 都是可重入锁; 重入锁ReentrantLock 相对来说是synchronized、Object.wait()和Object.notify()方法的替代品(或者说是增强版),在JDK5.0的早期版本,重入锁的性能远远好于synchronized, 但从JDK6.0开始,JDK在synchronized上做了大量的优化,使得两者的性能差距并不大。但ReentrantLock也有一些synchronized没法实现的特性。 ReentrantLock 在Java也是一个基础的锁,ReentrantLock 实现Lock接口提供一系列的基础函数,开发人员可以灵活的是应用函数满足各种复杂多变应用场景; * @author linxu * */ public class ReentrantLockDome { private static ReentrantLock reentrantLock = new ReentrantLock(true); /** * 为了明显直观的理解,我在这里将执行线程对像放进了队列,遵循先进先出的原则; */ static ConcurrentLinkedQueue<Runnable> queue = new ConcurrentLinkedQueue<>(); public static void main(String[] args) { // ExecutorService service = Executors.newFixedThreadPool(10); for (int i = 1; i < 10; i++) { final int j = i; queue.add(new Runnable() {// 按照顺序讲执行线程放到队列, @Override public void run() { // TODO Auto-generated method stub if (j % 2 == 1) { remove(j); } else { add(j); } } }); } new Thread() { public void run() { while (true) { if (!queue.isEmpty()) {// 从队列中取出执行线程,【遵循先进先出原则】 queue.poll().run(); } } } }.start(); } /** * 模拟添加 * @param count */ public static void add(int count) { reentrantLock.lock(); try { System.out.println(count + "=偶数;获取锁资源!执行增加!!!!" + "=======>【" + new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date())+"】"); Thread.sleep(3000); } catch (Exception e) { } finally { System.out.println( count + ":释放锁资源" + "=======>【" + new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date())+"】"); reentrantLock.unlock(); } } /** * 模拟删除 * @param count */ public static void remove(int count) { reentrantLock.lock(); try { System.out.println(count + "=奇数:获取锁资源!执行删除!!!!" + "=======>【" + new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date())+"】"); Thread.sleep(3000); } catch (Exception e) { // TODO: handle exception } finally { System.out.println( count + "释放锁资源" + "=======>【" + new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date())+"】"); reentrantLock.unlock(); } } } 结果: 1=奇数:获取锁资源!执行删除!!!!=======>【2019-59-02 17:59:09】 1释放锁资源=======>【2019-59-02 17:59:12】 2=偶数;获取锁资源!执行增加!!!!=======>【2019-59-02 17:59:12】 2:释放锁资源=======>【2019-59-02 17:59:15】 3=奇数:获取锁资源!执行删除!!!!=======>【2019-59-02 17:59:15】 3释放锁资源=======>【2019-59-02 17:59:18】 4=偶数;获取锁资源!执行增加!!!!=======>【2019-59-02 17:59:18】 4:释放锁资源=======>【2019-59-02 17:59:21】 5=奇数:获取锁资源!执行删除!!!!=======>【2019-59-02 17:59:21】 5释放锁资源=======>【2019-59-02 17:59:24】 6=偶数;获取锁资源!执行增加!!!!=======>【2019-59-02 17:59:24】 6:释放锁资源=======>【2019-59-02 17:59:27】 7=奇数:获取锁资源!执行删除!!!!=======>【2019-59-02 17:59:27】 7释放锁资源=======>【2019-59-02 17:59:30】 8=偶数;获取锁资源!执行增加!!!!=======>【2019-59-02 17:59:30】 8:释放锁资源=======>【2019-59-02 17:59:33】 9=奇数:获取锁资源!执行删除!!!!=======>【2019-59-02 17:59:33】 9释放锁资源=======>【2019-59-02 17:59:36】
以上是关于ReentrantLock重入锁的主要内容,如果未能解决你的问题,请参考以下文章