• 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漂
    票完了

    //发现一个很奇怪的问题 一个对象实例开启两个线程来跑 线程切换没那么频繁 即使是公平锁 ----两个实例一起跑结果缺可以切换频繁点
  • 相关阅读:
    112th LeetCode Weekly Contest Validate Stack Sequences
    112th LeetCode Weekly Contest Minimum Increment to Make Array Unique
    C# 有关系统音量的操作
    C# 关于时区的操作
    WordPress 设置GeoIP数据库目录权限时错误解决方案
    AtCoder Beginner Contest 113 C
    AtCoder Beginner Contest 113 B
    AtCoder Beginner Contest 113 A
    将Tomcat注册为Windows服务
    常用的调试方法
  • 原文地址:https://www.cnblogs.com/xuexidememeda/p/12248355.html
Copyright © 2020-2023  润新知