文档章节

ReentrantLock_可重入

noteman
 noteman
发布于 09/19 14:09
字数 344
阅读 3
收藏 0
package cunrent;

import java.util.Calendar;
import java.util.concurrent.locks.ReentrantLock;

public class TestReentrantLock {

    public static void main(String[] args) {
        //基础使用测试
//testLock1();
//可重入测试
        testLock();
    }

    public static void testLock1() throws Exception {
        ReentrantLockThread thread = new ReentrantLockThread();
        new Thread(thread).start();
        new Thread(thread).start();
        new Thread(thread).start();
    }

    public static void testLock() {
        TestLock tester = new TestLock();
        try {
            // 测试可重入,方法testReentry() 在同一线程中,可重复获取锁,执行获取锁后,显示信息的功能
            tester.testReentry();
            // 能执行到这里而不阻塞,表示锁可重入
            tester.testReentry();
            // 再次重入
            tester.testReentry();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放重入测试的锁,要按重入的数量解锁,否则其他线程无法获取该锁。
           // tester.getLock().unlock();
            //tester.getLock().unlock();
            tester.getLock().unlock();
        }

        try {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    tester.testReentry();
                }
            }).start();
        } catch (Exception e){

        }

        try {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true){
                        Calendar now = Calendar.getInstance();
                        System.out.println(now.getTime()+" "+Thread.currentThread().getName()+" try un lock.");
                        //tester.getLock().unlock();
                        if(tester.getLock().isLocked()){

                            tester.getLock().unlock();
                        }
                    }
                }
            }).start();
        } catch (Exception e){

        }

    }

}

class TestLock {
    /**
     * 可以重入
     */
    private ReentrantLock lock = null;

    public TestLock() {
        // 创建一个自由竞争的可重入锁
        lock = new ReentrantLock();
    }

    public ReentrantLock getLock() {
        return lock;
    }

    public void testReentry() {
        Calendar now = Calendar.getInstance();
        System.out.println(now.getTime()+" "+Thread.currentThread().getName()+" try get lock.");
        lock.lock();
        try {
            Thread.sleep(1000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(now.getTime()+" "+Thread.currentThread().getName()+" get lock.");
    }

}

class ReentrantLockThread implements Runnable {

    /**
     * 测试基本用法
     */

    // 创建一个ReentrantLock对象
    ReentrantLock lock = new ReentrantLock();

    @Override
    public void run() {
        try {
            // 使用lock()方法加锁
            lock.lock();
            for (int i = 0; i < 30; i++) {
                System.out.println(Thread.currentThread().getName()+"输出了:  "+i);
            }
        } finally {
            // 别忘了执行unlock()方法释放锁
            lock.unlock();
        }

    }
}

 

© 著作权归作者所有

共有 人打赏支持
noteman
粉丝 15
博文 233
码字总数 44869
作品 0
六安
再一次理解ReentrantLock

1. ReentrantLock的介绍 ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不...

你听___
2017/11/07
0
0
Java并发编程序列之JUC中的ReentrantLock-ReentrantReadWriteLock

Java并发编程序列之JUC中的ReentrantLock-ReentrantReadWriteLock Hello,大家好,之前两篇关于JUC中AQS的介绍算上大致把AQS是什么,自定义Lock怎么实现讲清楚了,这一篇就来说一说JDK中自带...

2017/12/27
0
0
究竟什么是可重入锁?

经历 很久之前就听说了可重入锁,可重入锁究竟是什么意思,以前是囫囵吞枣的,只要记住ReentrantLock和sychronized是可重入锁就行了,爱咋用咋用,好吧,原谅我的无知,最近对基础查漏补缺,...

rickiyeat
2017/10/22
0
0
Java 重入锁 ReentrantLock 原理分析

1.简介 可重入锁自 JDK 1.5 被引入,功能上与关键字类似。所谓的可重入是指,线程可对同一把锁进行重复加锁,而不会被阻塞住,这样可避免死锁的产生。ReentrantLock 的主要功能和 synchroniz...

Java-老刘
05/08
0
0
Java锁的种类以及辨析(四):可重入锁

作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型...

onedotdot
2017/11/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Ubuntu18.04下载安装Google图解法

首先Ctrl + Alt + T打开终端,或者可以在在搜索框搜索终端。 (1)sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/sources.list.d/ ,(将下载源加入到系统的...

AI_SKI
12分钟前
0
0
spring could采坑 eureka开启验证后无法连接注册中心

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClie......

君千殇520
12分钟前
0
0
支付宝小程序下单支付接口:40004 ACQ.INVALID_PARAMETER

下面是支付宝下单接口 https://docs.open.alipay.com/api_1/alipay.trade.create/ 如果按官方文档的说明,并没有解释清楚buyer_id什么时候要传,只是说:特殊可选,啥叫特殊可选?!在调小程...

swingcoder
21分钟前
0
0
【Java】广州三本秋招经历

前言 只有光头才能变强 离上次发文章已经快两个月时间了,最近一直忙着秋招的事。今天是2018年10月22日,对于互联网行业来说,秋招就基本结束了。我这边的流程也走完了(不再笔试/面试了),所...

Java3y
23分钟前
1
0
在idea中启动多个SpringBoot项目

https://blog.csdn.net/forezp/article/details/76408139

灯下草虫鸣_
25分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部