synchronized同步代码块

    xiaoxiao2022-07-03  108

    同步代码块有以下三种用法。

    synchronized(this) 锁当前类的对象。synchronized(X)锁非this对象Xsynchronized(class)锁当前类(所有该类的实例对象都将同步)

    1、synchronized(this)

    这个与synchronized是类似的,也是锁住当前对象的。 两种作用。 1)对同一对象的其他synchronized同步方法或者synchronized(this)同步代码块调用呈现阻塞状态。 2)在同一时间内,多个线程只有一个线程能调用同一对象中的一个synchronized同步方法或者synchronized(this)同步代码块。

    2、synchronized(非this对象)

    锁的是任意非this对象,可以是实例变量或者方法的参数

    作用 1)在多个线程持有的“非this对象”是同一个对象时,在同一时间只有一个线程可以执行synchronized中的代码块。 注意: 1)使用synchronized(非this对象)同步代码块时,synchronized(this)同步代码块可以异步执行,不受阻塞。 2)在使用synchronized(非this对象)同步代码块时,对象监视器必须是同一个对象(如果新对象也不行),否则也会是异步执行。 3)由于不同的线程执行之间是异步的,即执行顺序是随机的,在循环使用不同线程时,由于执行顺序的不确定性,如果线程执行的方法带有判断的代码时,就会出现逻辑上的错误(脏读),导致线程的不安全。 这时,需要在线程执行的方法的判断体外面再加一个synchronized同步代码块(给要保证同步的那个对象加锁),保证对象的变量的同步。

    3、synchronized(class)

    synchronized(class)和synchronized静态同步方法效果是一样的,都是给当前的class类对象加锁,加锁后,该类的所有对象都将受到这个锁的作用,即被阻塞同步调用。 此时,所有的对象都持有同一个锁。

    扩展1:多线程中的死锁

    如果双方都互相持有对方的锁,都在等待对象释放锁,但是由于是同步的,导致双方线程都阻塞,最后就造成了死锁。在设计时应该要避免这种问题的出现。

    扩展2:java中的内部类与嵌套类

    嵌套类分为静态嵌套类和非静态嵌套类,静态嵌套类一般就叫嵌套类,而非静态嵌套类叫做内部类。

    实例化内部类(需要先实例化外围的顶级类):

    PublicClass publicClass = new PublicClass(); //实例化一个顶级类 PrivateClass privateClass = publicClass.new PrivateClass(); //实例化内部类

    实例化静态内部类和普通的静态类没啥区别。

    最新回复(0)