文档章节

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
粉丝 14
博文 233
码字总数 44869
作品 0
六安
私信 提问
Java并发编程序列之JUC中的ReentrantLock-ReentrantReadWriteLock

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

2017/12/27
0
0
再一次理解ReentrantLock

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

你听___
2017/11/07
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

没有更多内容

加载失败,请刷新页面

加载更多

MicroStation Developer Shell

REG ADD HKLM\SOFTWARE\Microsoft\VisualStudio\8.0\Setup\VS /v ProductDir /t REG_SZ /d "C:\Program Files (x86)\Microsoft Visual Studio 8\VC\" /reg:32 CALL "C:\Program Files (x86)\......

oready
12分钟前
1
0
CURL常用命令

下载单个文件,默认将输出打印到标准输出中(STDOUT)中 curl http://www.centos.org 通过-o/-O选项保存下载的文件到指定的文件中: -o:将文件保存为命令行中指定的文件名的文件中 -O:使用U...

SuShine
17分钟前
1
0
docker搞个wordpress

1.先把wordpress的镜像下载下来 docker pull wordpress 2.下载mysql docker pull mysql:lastest 3.启动mysql docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:t......

无极之岚
29分钟前
2
0
【宇润日常疯测-005】PHP 中的 clone 和 new 性能比较

clone和new本不应该放在一起比较,它们的作用是不同的。但可能有一些场景下,可以用clone也可以用new,那么这时候我们选哪个呢? 我编写了两个测试,第一个是声明一个空类,第二个是带构造方...

宇润
29分钟前
2
1
点击按钮弹出类似IOS 底部 dialog

implementation 'com.baoyz.actionsheet:library:1.1.7' 然后设置按钮点击监听,,调用下列代码即可 ActionSheet.createBuilder(this, getSupportFragmentManager()) ......

lanyu96
32分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部