ReentrantLock售票的例子&sleep和wait的区别锁可重入是什么(笔记)
1 sleep 在哪里都可以用 调用Thread.sleep()但是 wait方法只能在同步方法和同步代码块中使用 wait也就是使得该线程成为阻塞状态(注意这里阻塞不是书本操作系统下的while循环实现的...我TM学傻了,这里阻塞特点1. 不耗cpu的等待;2. 线程安全;)
2.notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。
sleep()sleep 使得该线程让出cpu给其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁
可重入锁
reentrantlock是独占锁且可重入的 synchronized 也可以重入
可重入意思就是这个线程已经获取锁了,你再获取该锁还能获取 获取的还是原来的锁 不会出现问题 可以降低编程难度
代码可以测试
new Thread(new Runnable() {
@Override
public void run() {
synchronized (this) {
System.out.println("第1次获取锁,这个锁是:" + this);
int index = 1;
while (true) {
synchronized (this) {
System.out.println("第" + (++index) + "次获取锁,这个锁是:" + this);
}
if (index == 10) {
break;
}
}
}
}
}).start();
}
测试结果
第1次获取锁,这个锁是:Main$@710a3057
第2次获取锁,这个锁是:Main$@710a3057
第3次获取锁,这个锁是:Main$@710a3057
第4次获取锁,这个锁是:Main$@710a3057
第5次获取锁,这个锁是:Main$@710a3057
第6次获取锁,这个锁是:Main$@710a3057
第7次获取锁,这个锁是:Main$@710a3057
第8次获取锁,这个锁是:Main$@710a3057
第9次获取锁,这个锁是:Main$@710a3057
第10次获取锁,这个锁是:Main$@710a3057
reentrantlock实现买票的例子
public class ReentrantLockSailTicket implements Runnable {
static int ticket = 50;
Lock lock = new ReentrantLock(true); //注意这个地方
@Override
public void run() {
try {
lock.lock();
while (ticket>0)
{
ticket--;
System.out.println(Thread.currentThread().getName()+"卖出了第"+ticket+"漂");
TimeUnit.MILLISECONDS.sleep(15);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
System.out.println("票完了");
}
}
主类
ReentrantLockSailTicket station11=new ReentrantLockSailTicket();
ReentrantLockSailTicket w1=new ReentrantLockSailTicket();
Thread t1=new Thread(station11,"第一个");
Thread t2=new Thread(w1,"第二个");
t1.start();
t2.start();
运行结果
第二个卖出了第36漂
第一个卖出了第35漂
第二个卖出了第34漂
第一个卖出了第33漂
第二个卖出了第32漂
第一个卖出了第31漂
第一个卖出了第30漂
第二个卖出了第29漂
第二个卖出了第28漂
第一个卖出了第27漂
第二个卖出了第26漂
第一个卖出了第25漂
第二个卖出了第24漂
第一个卖出了第23漂
第二个卖出了第22漂
第一个卖出了第21漂
第二个卖出了第20漂
第一个卖出了第19漂
第二个卖出了第18漂
第二个卖出了第17漂
第一个卖出了第16漂
第二个卖出了第15漂
第一个卖出了第14漂
第二个卖出了第13漂
第一个卖出了第12漂
第一个卖出了第11漂
第二个卖出了第10漂
第二个卖出了第9漂
第一个卖出了第8漂
第二个卖出了第7漂
第一个卖出了第6漂
第一个卖出了第5漂
第二个卖出了第4漂
第一个卖出了第3漂
第二个卖出了第2漂
第二个卖出了第1漂
第一个卖出了第0漂
票完了
//发现一个很奇怪的问题 一个对象实例开启两个线程来跑 线程切换没那么频繁 即使是公平锁 ----两个实例一起跑结果缺可以切换频繁点
ReentrantLock售票的例子&sleep和wait的区别锁可重入是什么(笔记)的更多相关文章
- Java 显示锁 之 重入锁 ReentrantLock(七)
ReentrantLock 重入锁简介 重入锁 ReentrantLock,顾名思义,就是支持同一个线程对资源的重复加锁.另外,该锁还支持获取锁时的公平与非公平性的选择. 重入锁 ReentrantL ...
- Java 重入锁 ReentrantLock 原理分析
1.简介 可重入锁ReentrantLock自 JDK 1.5 被引入,功能上与synchronized关键字类似.所谓的可重入是指,线程可对同一把锁进行重复加锁,而不会被阻塞住,这样可避免死锁的产生 ...
- [图解Java]ReentrantLock重入锁
图解ReentrantLock 0. demo 我先给出一个demo, 这样大家就可以根据我给的这段代码, 边调试边看源码了. 还是那句话: 注意"My" , 我把Reentran ...
- 多线程通信的两种方式? (可重入锁ReentrantLock和Object)
(一)Java中线程协作的最常见的两种方式: (1)利用Object的wait().notify()和notifyAll()方法及synchronized (2)使用Condition.Reentra ...
- 可重入锁:ReentrantLock理解使用
(一)可重入性 可重入性描述这样的一个问题:一个线程在持有一个锁的时候,它内部能否再次(多次)申请该锁.如果一个线程已经获得了锁,其内部还可以多次申请该锁成功.那么我们就称该锁为可重入锁.通过以下伪代 ...
- 【java并发编程】ReentrantLock 可重入读写锁
目录 一.ReentrantLock可重入锁 二.ReentrantReadWriteLock读写锁 三.读锁之间不互斥 欢迎关注我的博客,更多精品知识合集 一.ReentrantLock可重入锁 可 ...
- 从源码角度彻底理解ReentrantLock(重入锁)
目录 1.前言 2.AbstractQueuedSynchronizer介绍 2.1 AQS是构建同步组件的基础 2.2 AQS的内部结构(ReentrantLock的语境下) 3 非公平模式加锁流程 ...
- Java并发(九):重入锁 ReentrantLock
先做总结: 1.为什么要用ReentrantLock? (1)ReentrantLock与synchronized具有相同的功能和内存语义: (2)synchronized是重量级锁,性能不好.Ree ...
- ReentrantLock(重入锁)简单源码分析
1.ReentrantLock是基于AQS实现的一种重入锁. 2.先介绍下公平锁/非公平锁 公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公平锁 非公平锁是指多个线程获取锁的顺序并不是按照申 ...
随机推荐
- Python学习第二十三课——Mysql 表记录的一些基本操作 (查)
查(select * from 表名) 基本语法: select <字段1,字段2,...> from <表名> where <表达式>; 例如,查询student ...
- 「JSOI2010」排名
「JSOI2010」排名 传送门 看到先后顺序限制和字典序,很容易想到拓扑排序 + 贪心. 考虑具体做法: 对于第一问: 我们开一个大根堆来代替队列,然后从大到小构造出各个元素的排名. 我们连边 \( ...
- 操作系统OS,Python - 有了GIL为什么还要threading.Lock()?
参考: https://stackoverflow.com/questions/49859287/what-is-the-need-of-threading-lock-when-cpython-has ...
- git合并分支到主干
1.从当前分支切换主干 git checkout master 2.更新主干内容到本地 git pull 4.提交分支,并将分支merge到主干 git merge dev 5: i键后输入备注 输 ...
- SZWI3800
xml <mapper namespace="jp.co.alsok.g6.zwi.dao.mapper.g6.custom.SZWI3800Mapper"> < ...
- win10程序无法正常启动0xc0000142
office用的好好的,今天一早打开电脑,突然就打不开了.显示如图: 我个人猜测可能还是昨天更新其他软件的时候导致的,有个软件更新后,让我重启,当时因为忙,就没有重启.今天一开机,就发现office用 ...
- java_3:JVM、JRE、JDK区别和联系
首先 三者之间存在包含关系JVM + 核心类库 = JREJRE + java开发工具(javac.exe/jar.exe) = JDK 什么是JVM? 我们知道Java语言有一个独特的优点就是可以跨 ...
- Spark教程——(10)Spark SQL读取Phoenix数据本地执行计算
添加配置文件 phoenixConnectMode.scala : package statistics.benefits import org.apache.hadoop.conf.Configur ...
- PHP PDO_MYSQL 链式操作 非链式操作类
<?php /* vim: set expandtab tabstop=4 shiftwidth=4: */ // +-------------------------------------- ...
- A letter for NW RDMA configuration
Dear : If you have to use EMC NW NDMA to backup oracle database and want to see what happen when bac ...