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.先介绍下公平锁/非公平锁 公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公平锁 非公平锁是指多个线程获取锁的顺序并不是按照申 ...
随机推荐
- 杭电 2159 fate(二维背包费用问题)
FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- ES-基本操作
(1)创建索引 put 192.168.247.197:9200/type2 /type2 (2)创建映射 post 192.168.247.197:9200/type2/type/_mapping ...
- 解决CentOS下boost安装后不能使用的问题
先说一说整个经历. 因为之前没有注意到gcc4.8.5比较旧,就已经安装好boost了,当时已经可以使用了,后来发现gcc太老了,一些软件安装需要比较新的gcc支持,所以决定升级gcc,结果boost ...
- 人工神经网络(从原理到代码) Step 01 感知器 梯度下降
版权声明: 本文由SimonLiang所有,发布于http://www.cnblogs.com/idignew/.如果转载,请注明出处,在未经作者同意下将本文用于商业用途,将追究其法律责任. 感知器 ...
- redhat7.6 crontab 服务,周期性任务
系统默认安装开启 systemctl status crond.service 查看周期性任务(最多每隔1分钟做周期性任务) crontab -l 系统自身的周期性任务 配置周期性任务 cront ...
- 五年C语言程序员,是深耕技术还是走管理?
从进入程序员行列开始(2013年6月),到现在为止(2019年2月),已经有五年半了. 一路波折,已经从无知菜鸟走到了意识觉醒的老鸟了. 薪资变化情况如下: 2013年:2000元/月 ( ...
- 1.项目创建及集成git
1.创建项目 (1)创建完以后,打开Terminal命令行,输入"git init"用于初始化本地仓库 (2)打开对应的项目文件夹,“Ctrl+h”可以查看该文件夹里是否存在.gi ...
- lower_bound() 函数使用详解
简介 lower_bound()函数是用来求一个容器中,第一个大于等于所要查找的元素的地址,具体的原理是二分查找,因此它只能用于非降序序列. 他有三个参数,第一个参数是容器的初始地址,第二个参数是容器 ...
- java动态代理中的invoke方法是如何被自动调用的
转载声明:本文转载至 zcc_0015的专栏 一.动态代理与静态代理的区别. (1)Proxy类的代码被固定下来,不会因为业务的逐渐庞大而庞大:(2)可以实现AOP编程,这是静态代理无法实现的:(3) ...
- FFmpeg RTSP流通过UDP传输问题
我自己在使用SRS服务的Ingest功能时发现在读取一个网络摄像头的RTSP流时一直不成功, 具体分析后发现SRS在调用FFmpeg时出了问题: /usr/local/ffmpeg/bin/ffmpe ...