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.先介绍下公平锁/非公平锁 公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公平锁 非公平锁是指多个线程获取锁的顺序并不是按照申 ...
随机推荐
- Jquery 事件 文本框常用
1.只许输入类型 //只能输入整数和小数 function txtKeyUpDecimal(txtName) { getID(txtName).keyup(function(){ //keyup事件处 ...
- spring使用context:property-placeholder载不进属性问题
环境:spring3.1.1+mybatis3.2.8+mybatis-spring1.2.3 今天整合了SpringMVC + MyBatis,发现了一个问题,在这里做个记录,各位如果遇到相同的问题 ...
- mcast_join函数
#include <errno.h> #include <string.h> #include <net/if.h> #include <netinet/in ...
- 关于MQTT连接的属性
连接相关的属性. 这些属性是MQTT的连接报文中连接标志字, 包含一些用于指定 MQTT 连接行为的参数. 1.清理会话(Clean Session) 客户端和服务端可以保存会话状态,以支持跨网络连接 ...
- QT无法读入txt文件内容
用vs写QT无法利用相对路径读入txt文件,应将此文件加入到资源文件中.
- 循环读取寄存器(QSFP-DD)并且分别保存log
#!/bin/bash ####################################################################### #Created by: Bin ...
- python爬虫(七) mozillacookiejar
MozillaCookiejar 保存百度得Cookiejar信息: from urllib import request from urllib import parse from http.coo ...
- 【PAT甲级】1024 Palindromic Number (25 分)
题意: 输入两个正整数N和K(N<=1e10,k<=100),求K次内N和N的反置相加能否得到一个回文数,输出这个数和最小的操作次数. trick: 1e10的数字相加100次可能达到1e ...
- 列表推导式、生成器表达式以及zip()max()max()/min()sum()sort()map()filter()的用法
列表推导式: 基本格式: variable = [out_exp_res for out_exp in input_list if out_exp == 2] #out_exp_res: 列表生成元素 ...
- 计划任务之一次性计划任务(at)和周期性计划任务(crontab)(重点)
一:知识要点 ----计划任务的意义----计划任务分类----用户计划任务crontab----系统计划任务----计划任务使用注意事项----anacron服务介绍 二:计划任务的意义计划任务 - ...