ReentrantLock售票的例子&sleep和wait的区别锁可重入是什么
Posted xuexidememeda
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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$1@710a3057 第2次获取锁,这个锁是:Main$1@710a3057 第3次获取锁,这个锁是:Main$1@710a3057 第4次获取锁,这个锁是:Main$1@710a3057 第5次获取锁,这个锁是:Main$1@710a3057 第6次获取锁,这个锁是:Main$1@710a3057 第7次获取锁,这个锁是:Main$1@710a3057 第8次获取锁,这个锁是:Main$1@710a3057 第9次获取锁,这个锁是:Main$1@710a3057 第10次获取锁,这个锁是:Main$1@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的区别锁可重入是什么的主要内容,如果未能解决你的问题,请参考以下文章
抓紧购票| 2018 NYC Blockchain Tech & Invest Summit售票火热进行中
[源码分析]ReentrantLock & AbstractQueuedSynchronizer
concurrent互斥锁ReentrantLock & 源码分析
[源码分析]ReentrantLock & AbstractQueuedSynchronizer & Condition