采用synchronized关键字写一个显示锁
public interface MyLock {
void lock () throws InterruptedException;
void lock(long millis) throws TimeoutException , InterruptedException ,ParametersIllegalException;
void unlock();
class TimeoutException extends Exception{
TimeoutException(String msg){
super(msg);
}
private static final long serialVersionUID = 1L;
}
class ParametersIllegalException extends Exception{
ParametersIllegalException(String msg){
super(msg);
}
private static final long serialVersionUID = 1L;
}
}
public class MyLockImpl implements MyLock{
private boolean initValue; // false表示monitor没有被占用
private Thread currentThread;
@Override
public synchronized void lock() throws InterruptedException {
while(initValue) {//monitor被占用
this.wait();
}
initValue = true;
currentThread = Thread.currentThread();
}
@Override
public synchronized void unlock() {
if(currentThread == Thread.currentThread()) {
System.out.println("【"+Thread.currentThread().getName()+"】" + " release the monitor");
initValue = false;
this.notifyAll();
}
}
@Override
public synchronized void lock(long millis) throws TimeoutException, InterruptedException, ParametersIllegalException {
if (millis <= )
throw new ParametersIllegalException("parameters illegal");
long hasRemaining = millis;
long endTime = System.currentTimeMillis() + millis;
while (initValue) {
if (hasRemaining <= )
throw new TimeoutException("Time out");
this.wait(millis);
hasRemaining = endTime - System.currentTimeMillis();
}
this.initValue = true;
this.currentThread = Thread.currentThread();
}
}
public class MyLockTest {
public static void main(String[] args) {
MyLock myLock = new MyLockImpl();
Stream.of("T1","T2","T3","T4").forEach(name ->
new Thread(()-> {
try {
myLock.lock();
System.out.println("【"+Thread.currentThread().getName()+"】" +" get the monitor");
m1();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (TimeoutException e) {
System.out.println("【"+Thread.currentThread().getName()+"】" +" timeout");
} catch (ParametersIllegalException e) {
System.out.println("【"+Thread.currentThread().getName()+"】" +" parameter illegal");
//e.printStackTrace();
}finally {
myLock.unlock();
}
},name).start()
);
}
public static void m1() throws InterruptedException {
System.out.println("【"+Thread.currentThread().getName()+"】" + "is working ...");
Thread.sleep(3_000);
}
}
注意wait方法可能存在spurious(假的)唤醒,wait方法应该在一个循环中使用

采用synchronized关键字写一个显示锁的更多相关文章
- 使用semaphore写一个显示锁
/** * 这里只是将Semaphore包装了一下,注意当Semaphore的构造参数是1时,本身就是一个显示锁 */ public class SemaphoreLock { ); public v ...
- 使用AtomicInteger写一个显示锁
利用了AtomicInteger的compareAndSet方法 public class CASLock { private AtomicInteger value = new AtomicInte ...
- 如何使用Shell写一个显示目录结构的命令?
公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ 在Linux中使用Shell写一个显示目录结构的命令,快速寻找目录结构. 1.代码 #!/usr/bin/env bash ...
- Java:synchronized关键字引出的多种锁
前言 Java 中的 synchronized关键字可以在多线程环境下用来作为线程安全的同步锁.本文不讨论 synchronized 的具体使用,而是研究下synchronized底层的锁机制,以及这 ...
- 用javascript写一个显示时间差 几分钟前 几小时前 几天前 几周前 大于一个月显示日期
window.onload = function(){ var show_times = $(".times span"); for(var i=0;i<show_times ...
- JAVA多线程之Synchronized关键字--对象锁的特点
一,介绍 本文介绍JAVA多线程中的synchronized关键字作为对象锁的一些知识点. 所谓对象锁,就是就是synchronized 给某个对象 加锁.关于 对象锁 可参考:这篇文章 二,分析 s ...
- java线程总结--synchronized关键字,原理以及相关的锁
在多线程编程中,synchronized关键字非常常见,当我们需要进行“同步”操作时,我们很多时候需要该该关键字对代码块或者方法进行锁定.被synchronized锁定的代码块,只能同时有一条线程访问 ...
- 精通java并发-synchronized关键字和锁
目前CSDN,博客园,简书同步发表中,更多精彩欢迎访问我的gitee pages synchronized关键字和锁 示例代码 public class MyThreadTest2 { public ...
- Java多线程:synchronized关键字和Lock
一.synchronized synchronized关键字可以用于声明方法,也可以用来声明代码块,下面分别看一下具体的场景(摘抄自<大型网站系统与Java中间件实践>) 案例一:其中fo ...
随机推荐
- 《深入java虚拟机》读书笔记之Java内存区域
前言 该读书笔记用于记录在学习<深入理解Java虚拟机--JVM高级特性与最佳实践>一书中的一些重要知识点,对其中的部分内容进行归纳,主要是方便之后进行复习. 运行时数据区域 Java虚拟 ...
- Hibernate【inverse和cascade属性】知识要点
Inverse属性 Inverse属性:表示控制权是否转移.. true:控制权已转移[当前一方没有控制权] false:控制权没有转移[当前一方有控制权] Inverse属性,是在维护关联关系的时候 ...
- Spring Boot(十四)RabbitMQ延迟队列
一.前言 延迟队列的使用场景:1.未按时支付的订单,30分钟过期之后取消订单:2.给活跃度比较低的用户间隔N天之后推送消息,提高活跃度:3.过1分钟给新注册会员的用户,发送注册邮件等. 实现延迟队列的 ...
- 大前端的自动化工厂(2)—— SB Family
原文链接:https://bbs.huaweicloud.com/blogs/53c0c3509b7a11e89fc57ca23e93a89f 我坦白我是标题党,SB只是SCSS-Bourbon的简写 ...
- Java开发笔记(二)Java工程的帝国区划
上一篇文章介绍了如何运行了第一个Java程序“Hello World”.然而这个开发环境看起来那么陌生,一个个名字符号完全不知道它们是干啥的呀,对于初学者来说,好比天书一般,多看几眼感觉都要走火入魔了 ...
- Java开发笔记(三十六)字符串的常用方法
不管是给字符串赋值,还是对字符串格式化,都属于往字符串填充内容,一旦内容填充完毕,则需开展进一步的处理.譬如一段Word文本,常见的加工操作就有查找.替换.追加.截取等等,按照字符串的处理结果异同,可 ...
- Oracle DB 12c first glance
单机上装了个12c,只看了看EM的界面……
- Microsoft Dynamics CRM 9.0 OP 版本 安装 的那些 雷
天天讲安装过程好无聊了,还是搞点有营养的东西来,那么后面来说说刚出来的MSCRM OP 9.0 版本安装的那些雷: 雷1:操作系统要求Windows 2016 Server 这点还好,因为之前安装MS ...
- Approval Process 在 Apex 中的使用
Approval Process(批准过程)简介 批准过程是一个复杂的业务过程.详细的内容可以参考官方文档. 英文版 中文版 官方trailhead模块 在Apex中调用Approval Proces ...
- 42.Odoo产品分析 (四) – 工具板块(10) – 问卷(2)
查看Odoo产品分析系列--目录 接上一篇Odoo产品分析 (四) – 工具板块(10) – 问卷(1) 4 页面 即问卷,点开一项查看: 可以看出,网页就是问卷本身的子目录,其中指明了该目录包括哪 ...