Lock接口

package concurency.chapter9;

import java.util.Collection;

public interface Lock {

static class TimeOutException extends Exception {

TimeOutException(String message) {

super(message);

}

}

void lock() throws InterruptedException;

void lock(long mills) throws InterruptedException,TimeOutException;

void unlock();

Collection getBlockedThread();

int getBlockedSize();

}

Lock实现类

package concurency.chapter9;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Collections;

import java.util.Optional;

public class BooleanLock implements Lock{

public BooleanLock(boolean initValue) {

this.initValue = initValue;

}

// false means is free

// true means having been used

private boolean initValue;

private Thread currentThread;

private Collection blockedThreads = new ArrayList<>();

@Override

public synchronized void lock() throws InterruptedException {

while(initValue) {

blockedThreads.add(Thread.currentThread());

this.wait();

}

blockedThreads.remove(Thread.currentThread());

this.initValue = true;

this.currentThread = Thread.currentThread();

}

@Override

public synchronized void lock(long mills) throws InterruptedException, TimeOutException {

// less than 0, Ignore it..

if(mills <= 0)

lock();

long hasRemaining = mills;

long endTime = System.currentTimeMillis() + mills;

while(initValue) {

if(hasRemaining <= 0)

throw new TimeOutException("time out, and the Thread[" + Thread.currentThread().getName()+"] do not get the lock");

blockedThreads.add(Thread.currentThread());

this.wait(mills);

hasRemaining = endTime - System.currentTimeMillis();

}

blockedThreads.remove(Thread.currentThread());

this.initValue = true;

this.currentThread = Thread.currentThread();

}

@Override

public synchronized void unlock() {

if(currentThread != null && Thread.currentThread() == currentThread) {

this.initValue = false;

Optional.of(Thread.currentThread().getName() + " release the lock...").ifPresent(System.out::println);

this.notifyAll();

}

}

@Override

public Collection getBlockedThread() {

return Collections.unmodifiableCollection(blockedThreads);

}

@Override

public int getBlockedSize() {

return blockedThreads.size();

}

}

测试

package concurency.chapter9;

import java.util.Optional;

import java.util.stream.Stream;

public class LockTest {

public static void main(String[] args) throws InterruptedException {

final BooleanLock booleanLock = new BooleanLock(false);

Stream.of("T1", "T2", "T3", "T4")

.forEach(name ->

new Thread(() -> {

try {

booleanLock.lock(1000L);

Optional.of(Thread.currentThread().getName() + " have the lock Monitor")

.ifPresent(System.out::println);

work();

} catch (InterruptedException e) {

e.printStackTrace();

} catch (Lock.TimeOutException e) {

System.out.println(e.getMessage());

// Optional.of(Thread.currentThread().getName() + " time out")

// .ifPresent(System.out::println);

} finally {

booleanLock.unlock();

}

}, name).start()

);

}

private static void work() throws InterruptedException {

Optional.of(Thread.currentThread().getName() + " is Working...")

.ifPresent(System.out::println);

Thread.sleep(10_000);

}

}

测试结果

T1 have the lock Monitor

T1 is Working...

time out, and the Thread[T2] do not get the lock

time out, and the Thread[T3] do not get the lock

time out, and the Thread[T4] do not get the lock

T1 release the lock...

java线程基础巩固---如何实现一个自己的显式锁Lock

拋出synchronized问题: 对于一个方法上了同锁如果被一个线程占有了,而假如该线程长时间工作,那其它线程不就只能傻傻的等着,而且是无限的等这线程工作完成了才能执行自己的任务,这里来演示一下这种 ...

Java编程的逻辑 &lpar;71&rpar; - 显式锁

​本系列文章经补充和完善,已修订整理成书,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

Java并发编程系列-&lpar;4&rpar; 显式锁与AQS

4 显示锁和AQS 4.1 Lock接口 核心方法 Java在java.util.concurrent.locks包中提供了一系列的显示锁类,其中最基础的就是Lock接口,该接口提供了几个常见的锁相关 ...

&OpenCurlyDoubleQuote;全栈2019”Java多线程第三十二章:显式锁Lock等待唤醒机制详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

4&period;显式锁 Lock

4.1 概念 内置锁 vs 显示锁 synchronize是java语言层面实现的锁,称为内置锁.使用方便代码简洁,而且在jdk新版本优化后,性能也得到了很大的提高.synchronize是一个可重入 ...

java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四)

Lock接口提供了方法Condition newCondition();用于获取对应锁的条件,可以在这个条件对象上调用监视器方法 可以理解为,原本借助于synchronized关键字以及锁对象,配备了 ...

java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)

目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...

java之AQS和显式锁

本次内容主要介绍AQS.AQS的设计及使用.ReentrantLock.ReentrantReadWriteLock以及手写一个可重入独占锁 1.什么是AQS? AQS,队列同步器AbstractQu ...

&OpenCurlyDoubleQuote;全栈2019”Java多线程第三十一章:中断正在等待显式锁的线程

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

随机推荐

Java读取word文档,转换为网页

public class Test3 { /** * * @param path * @param paths * @param savepaths */ public static void cha ...

Codeforces Round &num;365 &lpar;Div&period; 2&rpar; B 前缀和

B. Mishka and trip time limit per test 1 second memory limit per test 256 megabytes input standard i ...

LDD命令--可执行文件依赖的库出现错误时

http://littlepig3056.blog.163.com/blog/static/180758353201212751814134/ ldd  查看可执行文件依赖的库,结果会列出依赖的库名及 ...

Spring事务管理的两种方式

参考文档: http://www.iteye.com/topic/1123347 http://blog.csdn.net/lcj8/article/details/2835432 PS:好像还是tx ...

Caffe的运行mnist手写数字识别

老规矩,首先附上官方教程:http://caffe.berkeleyvision.org/gathered/examples/mnist.html 1.必要软件 因为Caffe中使用的是Linux才能 ...

logrotate 进行nginx日志分割

http://www.williamsang.com/archives/1254.html 日志分割常用方法: 自己写脚本分割 使用linux自带的logrotate 前者灵活,可以应对各种需求,自定 ...

C&num; 操作符 &lt&semi;&lt&semi; 与 &gt&semi;&gt&semi;

1.<< 左移操作符: 左移操作符,将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0.左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8. 如:x&lt ...

mui 列表项左右滑删除功能升级&lpar;仿微信左滑 点击删除后出现确认删除&rpar;

mui 列表项左右滑删除功能升级(仿微信左滑 点击删除后出现确认删除) 2018-06-19更新显示样式

对比库表结构,生成SQL

网上找了一圈对比库的工具,能手工生成差别的SQL的工具没有,改造了一下网上的sql 1, 获取字段名的类型 create FUNCTION [dbo].[getColType](@tab varcha ...

Linux下的JDK和OpenJDK有什么具体的区别

OpenJDK是JDK的开放原始码版本,以GPL(General Public License)协议的形式放出(题主提到的open就是指的开源).在JDK7的时候,OpenJDK已经作为JDK7的 ...

java 显示锁_Java 实现一个自己的显式锁Lock(有超时功能)相关推荐

  1. java 显式锁_Java 实现一个自己的显式锁Lock(有超时功能)

    Lock接口 package concurency.chapter9; import java.util.Collection; public interface Lock { static clas ...

  2. java 中的锁 aqs_Java并发编程系列-(4) 显式锁与AQS

    4 显示锁和AQS 4.1 Lock接口 核心方法 Java在java.util.concurrent.locks包中提供了一系列的显示锁类,其中最基础的就是Lock接口,该接口提供了几个常见的锁相关 ...

  3. java 可重入锁 clh_Java并发编程系列-(4) 显式锁与AQS

    4 显示锁和AQS 4.1 Lock接口 核心方法 Java在java.util.concurrent.locks包中提供了一系列的显示锁类,其中最基础的就是Lock接口,该接口提供了几个常见的锁相关 ...

  4. java 内置锁_深入理解java内置锁(synchronized)和显式锁(ReentrantLock)

    synchronized 和 Reentrantlock 多线程编程中,当代码需要同步时我们会用到锁.Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两种同 ...

  5. JAVA显式锁,各种锁分类

    显示锁优势 使用Java内置锁时,不需要通过Java代码显式地对同步对象的监视器进行抢占和释放,这些工作由JVM底层完成,而且任何一个Java对象都能作为一个内置锁使用,所以Java的对象锁使用起来非 ...

  6. 显式锁(二)Lock接口与显示锁介绍

    一.显式锁简介    显式锁,这个叫法是相对于隐式锁synchronized而言的,加锁和解锁都要用户显式地控制.显示锁Lock是在Java5中添加到jdk的,同synchronized一样,这也是一 ...

  7. Java多线程---线程通信(wait,notifyAll,生产者消费者经典范式,owner wait set,自定义显式锁BooleanLock)

    转自:https://blog.csdn.net/qq_35995514/article/details/91128585 1 学习内容 notifyAll 生产者.消费者经典范式 线程休息室 wai ...

  8. java多线程中 锁 的概念的理解,java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)...

    目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...

  9. java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)

    java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一) 目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronize ...

最新文章

  1. 锋利的JQuery学习笔记01
  2. main_loop()函数解析(1)
  3. 【Opencv实战】“一岁年龄一岁心,匆匆岁月不由人“这款年龄检测机等你来(附源码)
  4. 案例:6 种 A / B 测试成功培养用户使用习惯
  5. Collections.sort的使用
  6. Python入门基础之迭代和列表生成式
  7. java复选框只会选中一个_java复选框选中
  8. 代码行云流水..这位刚高中毕业的 UP 主,告诉我人的学习能力没有上限
  9. linux块设备缓存bcache
  10. Untiy中的数据平滑处理
  11. t检验临界值表中的n是什么_t检验临界值表
  12. 常见短信平台发送的号码有哪些?95开头、106开头短信发送号码区别说明
  13. 人生感悟:他们这样爬出烂泥般的人生
  14. 多线程代码,性能怎么优化!
  15. Javaweb(邮件发送)
  16. 日本高铁想到的网络安全
  17. 拼夕夕买家订单数据提取
  18. 服务器整机性能测试实验室,分析测试中心-重点实验室
  19. 常见开源NAS 操作系统及简单的安装
  20. CSDN-markdown 首行缩进的快捷实现

热门文章

  1. gitz之忽略warning:LF will be replaced by CRLF
  2. Ubuntu安装摄像头软件GTK_UVC_Viewer
  3. 个人开发—进度记录(一)
  4. Docker 镜像优化与最佳实践
  5. mysql安装排错-解决1
  6. [leetcode] 题型整理之动态规划
  7. Redis 缓存过期(maxmemory) 配置/算法 详解
  8. 电脑端的mafsvr服务关掉_想在电脑上玩手游,你得试试这款 quot;同屏助手quot; 了...
  9. 13凯越门锁继电器在哪里_汽车中控保险丝在哪里_汽车一年保险费_保险频道
  10. 我插计算机英语,帮我翻译以下计算机英语的句子