关于后端:我们一起来回顾一下Synchronized关键字吧

多线程始终Java开发中的难点,也是面试中的常客,趁着还有工夫,打算坚固一下JUC方面常识,我想机会随处可见,但始终都是留给有筹备的人的,心愿咱们都能加油!!!

沉下去,再浮上来,我想咱们会变的不一样的。

讲Lock接口之前先让咱们一起来回顾一下Synchronized关键字吧。我想咱们学Java开发这么久,不可能还有那个小伙伴没有用过synchronized

封面是宏大的朋友圈奉献的

JUC系列:

1、你晓得什么是JUC了吗?

正在继续更新中…

一、synchronized 作用范畴:

synchronized 是 Java 中的关键字,是一种同步锁。它润饰的对象有以下几种:

  1. 润饰某一处代码块,被润饰的代码块称为同步语句块。作用范畴就是{}之间。作用的对象是调用这个代码块的对象。

    synchronized (this){
        System.out.println("同步代码块 ");
    }
  2. 润饰在办法上,被润饰的办法就称为同步办法。作用范畴则是整个办法。作用的对象则是调用这个办法的对象。

    public synchronized void sale() {
        
    }

    :1)synchronized 关键字不能被继承,如果父类中某办法应用了synchronized 关键字,字类又刚巧笼罩了,此时,字类默认状况下是不同步的,必须显示的在子类的办法上加上才可。当然,如果在字类中调用父类中的同步办法,这样尽管字类并没有同步办法,但子类调用父类的同步办法,子类办法也相当同步了。

  3. . 润饰某个动态的办法,其作用的范畴是整个静态方法,作用的对象是这个类的所有对象

        public static synchronized void test(){
            
        }
  4. 润饰某个类,其作用的范畴是 synchronized 前面括号括起来的局部,作用的对象是这个类的所有对象

    class Ticket {
        public void sale() {
            synchronized (Ticket.class) {
    
            }
        }
    }

二、案例:

最初:咱们拿synchronized 写一下多线程中的卖票的经典案例:

public class SynchronizedDemo {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        
        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        }, "A").start();

        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        }, "B").start();
        new Thread(() -> {
            for (int i = 0; i < 40; i++) {
                ticket.sale();
            }
        }, "C").start();
    }
}

class Ticket {
    //票数
    private int number = 30;

    //操作方法:卖票
    public synchronized void sale() {
        //判断:是否有票
        if (number > 0) {
            System.out.println(Thread.currentThread().getName() + " : " + (number--) + " " + number);
        }
    }
}

三、总结:

synchronized 的同步效率非常低,因为一个如果某一块代码被synchronized 润饰了,当某一个线程进入了synchronized 润饰的代码块,那么其余线程只能始终期待,期待获取锁的线程开释锁,能力进入再次进入同步代码块。

获取锁的线程开释锁的状况只有两种:

  1. 失常执行完,而后开释锁。
  2. 执行过程中,产生异样,JVM让线程主动开释锁。

那么你试想一个如果获取到锁的这个线程,因为一些期待IO起因或其余起因被堵住了,然而又不能开释锁,其余线程就只能在synchronized的门口看着啦,你想一下这个效率吧,呈现一次,可能就把人心态玩没啦哈。😂

因而十分须要有一种机制可能不让期待的线程始终无限期的期待上来,比方改成期待一段时间或者响应中断,该怎么做呢?

咱们能够通过Lock来做这件事件。

四、喃喃自语

对于Lock的知识点就在下一篇文章中哦。

最近又开始了JUC的学习,感觉Java内容真的很多,然而为了可能走的更远,还是感觉应该须要打牢一下根底。

最近在继续更新中,如果你感觉对你有所帮忙,也感兴趣的话,关注我吧,让咱们一起学习,一起探讨吧。

你好,我是博主宁在春,Java学习路上的一颗小小的种子,也心愿有一天能扎根长成苍天大树。

心愿与君共勉😁

待咱们,别时相见时,都已有所成

感兴趣能够查看其余主页:

CSDN | 宁在春

掘金 | 宁在春

知乎 | 宁在春

简书 | 宁在春

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理