java可重入锁,简单几个小案例,测试特性。

  1.尝试锁  tryLock

package com.cn.cfang.ReentrantLock;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class Test02 { private Lock lock = new ReentrantLock(); private void m1(){
try{
lock.lock();
for(int i = ; i < ; i++){
TimeUnit.SECONDS.sleep();
System.out.println("m1() method " + i);
}
}catch(InterruptedException e){
e.printStackTrace();
}finally{
lock.unlock();
}
} private void m2(){
boolean isLocked = false;
try {
//尝试锁,如果已被其他线程锁住,无法获取锁标记,则返回false
//相反,如果获取锁标记,则返回true
//isLocked = lock.tryLock(); //阻塞尝试锁:会阻塞参数代表的时长,再去尝试获取锁标记
//如果超时未获取,不继续等待,直接返回false
//阻塞尝试锁类似于自旋锁。
isLocked = lock.tryLock(, TimeUnit.SECONDS);
if(isLocked){
System.out.println("method m2 synchronized");
}else{
System.out.println("method m2 unsynchronized");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(isLocked){
lock.unlock();
}
}
} public static void main(String[] args) {
Test02 t = new Test02(); new Thread(new Runnable() {
@Override
public void run() {
t.m1();
}
}).start();
try {
TimeUnit.SECONDS.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(new Runnable() {
@Override
public void run() {
t.m2();
}
}).start();
}
}

  2. 可中断

package com.cn.cfang.ReentrantLock;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* ReentrantLock的可打断性
*
* 打断 : 调用thread.interrupt()方法,可打断线程阻塞状态,抛出异常。
* 可尝试打断,阻塞等待锁。
*
* 阻塞状态 :包括普通阻塞状态,等待队列,锁池队列
* 普通阻塞 : sleep,可以被打断。
* 等待队列 : wait方法调用,也是一种阻塞状态,不能被打断,只能等待notify
* 锁池队列 : 无法获取锁标记。不是所有的锁池队列都能被打断
* ReentrantLock的lock获取锁标记的时候,如果未获取,需要阻塞的去等待锁标记,无法被打断
* ReentrantLock的lockInterruptibly获取锁标记的时候,如果未获取,需要阻塞等待,可以被打断
*
* @author cfang
* 2018年5月4日 下午2:23:41
*/
public class Test03 { private Lock lock = new ReentrantLock(); private void m1(){
try {
lock.lock();
for(int i = ; i < ; i++){
TimeUnit.SECONDS.sleep();
System.out.println("m1() method " + i);
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unlock();
}
} private void m2(){
try {
lock.lockInterruptibly(); //可尝试打断,阻塞等待锁,可以被其他的线程打断阻塞状态
System.out.println("m2() method");
} catch (InterruptedException e) {
// e.printStackTrace();
}finally{
//可能异常打断,所以释放锁标记必须进行异常处理
try {
lock.unlock();
} catch (Exception e2) {
e2.printStackTrace();
}
}
} public static void main(String[] args) {
Test03 t = new Test03(); new Thread(new Runnable() {
@Override
public void run() {
t.m1();
}
}).start(); try {
TimeUnit.SECONDS.sleep();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
t.m2();
}
});
t2.start(); try {
TimeUnit.SECONDS.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.interrupt(); //打断线程休眠阻塞等待。非正常结束阻塞状态的线程,都会抛出异常。
}
}

  3. 公平锁 : ReentrantLock可定义公平锁,多个线程竞争锁标记的时候,公平锁会记录等待时长,当前线程执行结束后,会优先选取等待时长最长的线程,去获取锁标记执行。

    synchronized不具有此特性。

 package com.cn.cfang.ReentrantLock;

 import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class Test04 { public static void main(String[] args) {
TestReentrantlock t = new TestReentrantlock();
new Thread(t).start();
new Thread(t).start();
} } class TestReentrantlock implements Runnable{ private Lock lock = new ReentrantLock(true); //加参数true,代表公平锁
@Override
public void run() {
for (int i = ; i < ; i++) {
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + " get lock");
}finally{
lock.unlock();
}
}
}
}

ReentrantLock API的更多相关文章

  1. Java并发基础框架AbstractQueuedSynchronizer初探(ReentrantLock的实现分析)

    AbstractQueuedSynchronizer是实现Java并发类库的一个基础框架,Java中的各种锁(RenentrantLock, ReentrantReadWriteLock)以及同步工具 ...

  2. 【Java并发编程实战】-----“J.U.C”:ReentrantLock之二lock方法分析

    前一篇博客简单介绍了ReentrantLock的定义和与synchronized的区别,下面跟随LZ的笔记来扒扒ReentrantLock的lock方法.我们知道ReentrantLock有公平锁.非 ...

  3. ReentrantLock实现原理深入探究

    前言 这篇文章被归到Java基础分类中,其实真的一点都不基础.网上写ReentrantLock的使用.ReentrantLock和synchronized的区别的文章很多,研究ReentrantLoc ...

  4. Lock的实现之ReentrantLock详解

    摘要 Lock在硬件层面依赖CPU指令,完全由Java代码完成,底层利用LockSupport类和Unsafe类进行操作: 虽然锁有很多实现,但是都依赖AbstractQueuedSynchroniz ...

  5. Java并发控制:ReentrantLock Condition使用详解

    生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区.其中一个是生产者,用于将消息放入缓冲区:另外一个 ...

  6. java JDK8 学习笔记——第11章 线程和并行API

    第11章 线程与并行API 11.1 线程 11.1.1 线程 在java中,如果想在main()以外独立设计流程,可以撰写类操作java.lang.Runnable接口,流程的进入点是操作在run( ...

  7. 《深入浅出 Java Concurrency》—锁紧机构(一)Lock与ReentrantLock

    转会:http://www.blogjava.net/xylz/archive/2010/07/05/325274.html 前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最 ...

  8. ReentrantLock实现原理

    以下是本篇文章的大纲 1 synchronized和lock 1.1 synchronized的局限性 1.2 Lock简介 2 AQS 3 lock()与unlock()实现原理 3.1 基础知识 ...

  9. ReentrantLock实现原理及源码分析

    ReentrantLock是Java并发包中提供的一个可重入的互斥锁.ReentrantLock和synchronized在基本用法,行为语义上都是类似的,同样都具有可重入性.只不过相比原生的Sync ...

随机推荐

  1. Spring框架完全掌握(下)

    接着上一篇文章的内容Spring框架完全掌握(上),我们继续深入了解Spring框架. Spring_AOP 考虑到AOP在Spring中是非常重要的,很有必要拿出来单独说一说.所以本篇文章基本上讲述 ...

  2. 服务注册发现、配置中心集一体的 Spring Cloud Consul

    前面讲了 Eureka 和 Spring Cloud Config,今天介绍一个全能选手 「Consul」.它是 HashiCorp 公司推出,用于提供服务发现和服务配置的工具.用 go 语言开发,具 ...

  3. Spring学习之旅(十)--MockMvc

    在之前的 Spring学习之旅(八)--SpringMVC请求参数 我们是通过在控制台输出来验证参数是否正确,但是这样做实在是太耗时间了,我们今天来学习下 MockMvc,它可以让我们不需要启动项目就 ...

  4. Python源码学习Schedule

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  5. cucumber测试框架

    1.1 什么是BDD(行为驱动开发)  首先了解一个概念,BDD(BehaviorDrivenDevelopment:行为驱动开发)为用户提供了从 开发人员和客户的需求创建测试脚本的机会.因此,开始时 ...

  6. 安排:《蚂蚁花呗1234面:Redis+分布式架构+MySQL+linux+红黑树》

    前言: 大厂面试机会难得,为了提高面试通关率,建议朋友们在面试前先复盘自己的知识栈,依据掌握程度划分重要.优先级,系统地去学习!如果不准备充分就去参加面试,既会失去进入大厂的机会,更是对自己的不负责. ...

  7. CAD数据分块,偏移校准,加载到百度地图、高德地图、谷歌等地图上

    前面分享过一篇如何将CAD海量数据显示在百度地图上(百度地图Canvas实现十万CAD数据秒级加载),但是很多开发者在CAD数据提取时遇到了问题,所以接下来的文章将介绍如何将CAD数据提取. 准备软件 ...

  8. HDU 2561 二小整数

    第二小整数 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  9. ‎Cocos2d-x 学习笔记(24) ParticleSystem ParticleSystemQuad

    1. ParticleSystem ParticleData是存储粒子数据的类,ParticleSystem会关联一个ParticleData对象. ParticleSystem直接继承了Node.T ...

  10. 用.NET写“算命”程序

    用.NET写"算命"程序 "算命",是一种迷信,我父亲那一辈却执迷不悟,有时深陷其中,有时为求一"上上签",甚至不惜重金,向"天神 ...