wait和sleep的区别,Synchronized锁和lock锁的区别你真的搞懂了吗?

news/2024/5/20 7:19:01 标签: java, 多线程, 并发编程, juc,

一:wait()和sleep()方法

1、二者来自不同的类

wait ----> Objec类
sleep—> Thread类

2、关于的释放

wait 会释放
sleep 睡觉了,抱着睡觉,不会释放!

3、使用的范围是不同的

wait 必须在同步代码块中使用
sleep 可以再任何地方睡眠

没错,sleep它就是校长,想在那儿睡就在那儿睡!

二:Synchronized和lock

传统Synchronized
这里我们就用一个多线程买票的例子来说明

java">public class SaleTicketTDemo01 {
    /*
     * 真正的多线程开发,公司中的开发,降低耦合性
     * 线程就是一个单独的资源类,没有任何附属的操作!
     * 1、 属性、方法
     */
    public static void main(String[] args) {
        //并发:多个线程同时操作一个资源类,把资源类丢入线程
        Ticket ticket = new Ticket();
        // @FunctionalInterface 函数式接口,jdk1.8 lambada表达式
        new Thread(() -> {
            for (int i = 1; i < 50; i++) {
                ticket.sale();
            }
        }, "A").start();
        new Thread(() -> {
            for (int i = 1; i < 50; i++) {
                ticket.sale();
            }
        }, "B").start();
        new Thread(() -> {
            for (int i = 1; i < 50; i++) {
                ticket.sale();
            }
        }, "C").start();
    }
}
//资源类 OOP
class Ticket {
    //属性、方法
    private int number = 50;
    // 卖票的方式
    // synchronized 本质: 队列,
    public synchronized void sale() {
        if (number > 0) {
            System.out.println(Thread.currentThread().getName() + "卖出了" +
                    (50-(--number)) + "张票,剩余:" + number + "张票");
        }
    }
}

运行结果
在这里插入图片描述
Lock(重点)
在这里插入图片描述
在这里插入图片描述
公平:十分公平,线程执行顺序按照先来后到顺序
非公平:十分不公平:可以插队 (默认

多线程卖票中的Synchronized换成Lock

java">public class SaleTicketTDemo01 {

    public static void main(String[] args) {
        //并发:多个线程同时操作一个资源类,把资源类丢入线程
        Ticket2 ticket = new Ticket2();
        // @FunctionalInterface 函数式接口,jdk1.8 lambada表达式
        new Thread(() -> {
            for (int i = 1; i < 50; i++) {
                ticket.sale();
            }
        }, "A").start();
        new Thread(() -> {
            for (int i = 1; i < 50; i++) {
                ticket.sale();
            }
        }, "B").start();
        new Thread(() -> {
            for (int i = 1; i < 50; i++) {
                ticket.sale();
            }
        }, "C").start();
    }
}

/资源类 OOP
class Ticket1 {
    //属性、方法
    private int number = 50;
    // 卖票的方式
    // synchronized 本质: 队列,
    public synchronized void sale() {
        if (number > 0) {
            System.out.println(Thread.currentThread().getName() + "卖出了" +
                    (50-(--number)) + "张票,剩余:" + number + "张票");
        }
    }
}

运行结果
在这里插入图片描述
Synchronized 和 Lock 区别:
1、Synchronized 内置的Java关键字, Lock 是一个Java类
2、Synchronized 无法判断获取的状态,Lock 可以判断是否获取到了
3、Synchronized 会自动释放,lock 必须要手动释放!如果不释放,死
4、Synchronized 线程 1(获得,如果线程1阻塞)、线程2(等待,傻傻的等);Lock就不一定会等待下去;
5、Synchronized 可重入,不可以中断的,非公平;Lock ,可重入,可以判断,非公平(可以自己设置);
6、Synchronized 适合少量的代码同步问题,Lock 适合大量的同步代码!

最后,给大家留一个思考题,是什么,如何判断的是什么?
欢迎大家留言讨论!


http://www.niftyadmin.cn/n/1715668.html

相关文章

python爬取交通情况数据论文参考文献_城市轨道交通研究论文参考文献范例

城市轨道交通研究论文参考文献范例[1] 邹胜勇.面向可持续发展的城市总体交通结构优化[J].交通运输系统工程与信息&#xff0c;2006&#xff0c;6(2)&#xff1a;108.[2] David BAYLISS.世界范围的城市交通可达性现状(英文)[J].TRI杂志(交通版)&#xff0c;2006(2)&#xff1a;1…

JUC多线程编程之生产者与消费者问题(Synchronized和JUC版)

生产者与消费者问题 在面试中&#xff0c;生产者与消费者是高频问题之一 1.生产者和消费者问题 Synchronized 版 public class A {public static void main(String[] args) {Data data new Data();new Thread(() -> {for (int i 0; i < 10; i) {try {data.increment…

JUC多线程编程八锁你都知道了吗?关于锁的八个问题

关于锁的八个问题—八锁 前面的文章中留下一个疑问&#xff0c;到底什么是锁&#xff0c;锁到底锁的是谁&#xff1f; 这里我们就用打电话和发短信的例子来距离说明八锁问题—>锁的是对象方法的调用者或者Class模板&#xff08;.class&#xff09; 1、标准情况下&#xff…

使用宝塔部署node项目_宝塔面板如何部署nuxt项目

1、先在本地执行npm run build 命令&#xff0c;然后将项目根目录下除了node_modules文件夹&#xff0c;其他都打包上传到服务器web服务下&#xff0c;注意.nuxt是隐藏文件夹。当然其实不build也可以&#xff0c;在服务上执行sudo npm install 后再执行 run build也一样。然后执…

写入时复制原理和过程以及CopyOnWriteArrayList源码实现的深入剖析

问题疑问 1.为什么要叫写入时复制集合&#xff1f; 2.CopyOnWriteArrayList 实现原理是什么&#xff1f; 3.CopyOnWriteArrayList 和 ArrayList 有什么区别&#xff1f; 4.CopyOnWriteArrayList 复制是怎么进行复制的&#xff1f; 接下来就让我们带着这几个问题&#xff0c;从…

走进callable,来看看callable是怎么一步步勾搭上Thread的!

1.Callable接口 2.Callable与Runnable不同 *1.Callable是java.util.concurrent下的接口&#xff0c;有返回值&#xff0c;可以跑出被检查出的异常 *2Runable是java.lang下的接口&#xff0c;没有返回值&#xff0c;不可以抛出检查出的异常 *3.二者重写调用的方法不同&#xf…

sublime编译python乱码_Sublime Text 3使用virtualenv插件编译时编译结果乱码的问题解决方案...

使用sublime text 3编写python脚本时&#xff0c;平常使用CtrlB的编译系统编译在输出结果中中文就是显示正确的中文&#xff0c;不会显示乱码&#xff0c;但是当我启用了virtualenv插件&#xff0c;使用虚拟环境编译时&#xff0c;却看到中文显示出了乱码。我又在cmd运行python…

JUC的三大常用辅助类,你都知道吗?

1.countDownLatch 减法计数器&#xff1a;实现调用几次线程后&#xff0c;在触发另一个任务 简单代码实现&#xff1a; *举例说明&#xff1a;就像五个人在同一房间里&#xff0c;有一个看门的大爷&#xff0c;当五个人都出去后&#xff0c;他才能锁门&#xff0c;也就是说 执…