采用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 ...
随机推荐
- Chapter 5 Blood Type——2
The rest of the morning passed in a blur. 早上剩下的时间都在模糊中度过了. It was difficult to believe that I hadn't ...
- HBase查询优化
1.概述 HBase是一个实时的非关系型数据库,用来存储海量数据.但是,在实际使用场景中,在使用HBase API查询HBase中的数据时,有时会发现数据查询会很慢.本篇博客将从客户端优化和服务端优化 ...
- 设计模式总结篇系列:享元模式(Flyweight)
我们都知道,Java中的String类具有如下特性:String是一个不可变类,当直通过用字符串方式使用String对象时,Jvm实际上在内存中只存有一份,且存在字符串常量池中.当对字符串直接进行修改 ...
- Linux vi常用命令
vi常用命令[Ctrl] + [f] 屏幕『向前』移动一页(常用)[Ctrl] + [b] 屏幕『向后』移动一页(常用)0 这是数字『 0 』:移动到这一行的最前面字符处(常用)$ 移动到这一行的最后 ...
- C-sizeof和strlen区别,以及sizeof如何计算结构体大小
sizeof和strlen区别 sizeof是关键字,在编译时就能计算出值,可以计算任何类型 strlen是函数,只有在运行时才能去计算,且只能计算字符型的. 对于数组时,strlen是判断’\0’为 ...
- sprinbcloud学习之-Failed to bind properties under 'logging.level' to java.util.Map<java.lang.String>
日志报错,提示Failed to bind properties under 'logging.level' to java.util.Map<java.lang.String>, 原因为 ...
- 用node.js express设置路径后 子路径下的页面访问静态资源路径出问题
在routes/news_mian.js 设置了访问news_main.html 的路径 '/',通知设置一个访问news-page.html的子路径'/newspage'子路径.但是在访问loacl ...
- 微信小程序picker的坑
js文件: Companyarr: [{ id: '公司id1', companyname: "公司1的名字" }, { id: '公司id2', companyname: &qu ...
- Android WebView的HTML中的select标签不起作用
Android WebView的HTML中的select标签不起作用 经过查询资料,了解到android对html里的select标签是弹出一个原生的选择器. 问题: Webview中的select没 ...
- Vsphere 回收未消使用的磁盘空间
下载sdelete.exe 执行 sdelete.exe -z E: ,然后又恢复为原可用空间 关机 SHH进入物理主机,找到对应的虚机文件 执行vmkfstools -K test-Win200 ...