采用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 ...
随机推荐
- Unity实现c#热更新方案探究(二)
转载请标明出处:http://www.cnblogs.com/zblade/ 一.IOS对DLL热更新的禁止 紧接上文,继续对C#热更新的研究.上文中,已经说了如何基于appDomain来实现对DLL ...
- 【java多线程】多线程的创建三种方式--笔记
申明:线程的概念以及进程的相关概念,可以参考网络上其他资料,这里只讨论多线程是怎么实现. 一.多线程的简单理解 明白什么是多线程,小生通俗一点的理解为:在一个程序里,我想同时让这个程序完成多个任务. ...
- Java开发知识之Java中的泛型
Java开发知识之Java中的泛型 一丶简介什么是泛型. 泛型就是指泛指任何数据类型. 就是把数据类型用泛型替代了. 这样是可以的. 二丶Java中的泛型 Java中,所有类的父类都是Object类. ...
- [十九]JavaIO之PipedReader 和 PipedWriter
功能简介 还记得PipedInputStream 和 PipedOutputStream么 我们之前是这么说的: p, li { white-space: pre-wrap; } 使用管道通信时,必 ...
- BEAMER中 Package Listings Warning: Text dropped after begin of listing on input line xx
Latex Beamer 模板 frame 中使用 listings package时总出现标题所示错误,无法前进.解决方法是在\begin{frame}后加上一个选项,即:\begin{frame} ...
- DHTMLX 常用技术
GRID的行设置前景色和背景色 $dataItem->set_row_color("red"); // 设置背景色 $dataItem->set_row_style(& ...
- Nginx 初識
今天簡單了解了一下Nginx,并在本機安裝,并簡單配置了一下,道理什麼的還不懂,就是看能不能跑起來. 1.安裝從官網下載就好,把文件隨便解壓在一個英文目錄裡面. 然後修改配置文件,修改的內容如下: 2 ...
- python学习笔记(十 三)、网络编程
最近心情有点儿浮躁,难以静下心来 Python提供了强大的网络编程支持,很多库实现了常见的网络协议以及基于这些协议的抽象层,让你能够专注于程序的逻辑,而无需关心通过线路来传输比特的问题. 1 几个网络 ...
- 数据结构(java版)学习笔记(序章)
程序=数据结构+算法 序章做一个简单的思维导图,方便理解数据结构这门课的大纲,接下来我们将是按照线性表,栈,队列,串,树和图的顺序依次往下学.
- 忘记时间戳的存在——Yii2超实用的自动更新时间戳的Behavior(改进版)
本文改进了Yii2中内置行为类TimestampBehavior,使得时间戳字段(如created_at,updated_at) 完全自己更新,方便得让你忘记它们的存在. Yii2的内置行为类Time ...