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.先介绍下公平锁/非公平锁 公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公平锁 非公平锁是指多个线程获取锁的顺序并不是按照申 ...
随机推荐
- Java中获取MongoDB连接的方法
首先是所需jar包,Maven中的配置如下: <dependency> <groupId>org.mongodb</groupId> <artifactId& ...
- idea 配置JVM参数
-Dfile.encoding=UTF-8 -Xms512m -Xmx3072m -XX:PermSize=512m
- 如何用VBA代码依次打开文件夹下的Excel文件
'Check Public Function Check() As Variant On Error GoTo erlb Dim StrDir As String StrDir = T ...
- 洛谷 CF798C Mike and gcd problem
嗯... 题目链接:https://www.luogu.org/problemnew/show/CF798C 这道题首先要会写gcd..也类似一种找规律吧... 问题的操作是在两个数的基础上进行的: ...
- 理解WPF中的视觉树和逻辑树
轉載地址:http://blog.csdn.net/changtianshuiyue/article/details/26981797 理解WPF中的视觉树和逻辑树 Understanding th ...
- centos7 ip配置及ssh服务连接
一.配置ip /etc/sysconfig/network-scripts/ifcfg-ens33 ifcfg-ens33 这个是配置网卡的配置文件,名字可能不一样,大概为:ifcfg-网卡名 TYP ...
- Spring Boot Security JWT 整合实现前后端分离认证示例
前面两章节我们介绍了 Spring Boot Security 快速入门 和 Spring Boot JWT 快速入门,本章节使用 JWT 和 Spring Boot Security 构件一个前后端 ...
- python 基础之集合
集合 s=set('chen xi') s1=['cx','ee','cx'] s2=set(s1)#set为集合 print(s2,type(s2)) s=list(s2) print(s,type ...
- Java基础 -1.4
标识符与关键字 对于标识符的组成在Java之中的定义如下:由字母.数字._.$ 组成 其中不能使用Java的保留字(关键字) 其中 $ 一般都有特殊的含义 不建议出现在自己所编写的代码上 关键字 是系 ...
- postInvalidate 解决View.GONE,没有刷新的问题
问题描述:布局: <ScrollView id="scroll"> <LinearLayout id="container"> < ...