码迷,mamicode.com
首页 > 其他好文 > 详细

ReentrantLock售票的例子&sleep和wait的区别锁可重入是什么

时间:2020-02-01 14:33:46      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:++i   pre   runnable   exception   over   ant   new t   main   同步代码块   

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的区别锁可重入是什么

标签:++i   pre   runnable   exception   over   ant   new t   main   同步代码块   

原文地址:https://www.cnblogs.com/xuexidememeda/p/12248355.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!