Lombok注解之@Synchronized

1.使用范围

方法:只能修饰方法

2.介绍

synchronized是线程安全中一个重要的关键字,它是一种同步锁,主要用来保证在同一个时刻,只有一个线程可以执行某个方法或者某段代码块。一般使用synchronized去锁住代码块,而不是方法,因为锁住代码块效率更高。

@Synchronized是synchronized方法修饰符的更安全的变体。与一样synchronized,注释只能在静态方法和实例方法上使用。它的操作类似于synchronized关键字,但是它锁定在不同的对象上。关键字锁定在上this,但注释锁定在名为的字段上$ lock,该字段是私有的。

如果该字段不存在,则会为您创建。如果对static方法进行注释,则注释将锁定在名为的静态字段上$ LOCK。

如果需要,可以自己创建这些锁。在$ lock和$ LOCK领域会当然不会,如果你已经自己原创生成的。您还可以通过将其指定为@Synchronized注释的参数来选择锁定另一个字段。在此用法变型中,不会自动创建字段,并且您必须自己明确创建它们,否则会发出错误。

3.属性

4.实例

public class TestSynchronized {
    @Synchronized
    private void method() {
        System.out.println("method()");
    }
    @Synchronized
    private static void staticMethod() {
        System.out.println("staticMethod()");
    }
    public static void main(String[] args) {
        
    }
}

编译后:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.learn.lombok;

public class TestSynchronized {
    private final Object $lock = new Object[0];
    private static final Object $LOCK = new Object[0];

    public TestSynchronized() {
    }
    private void method() {
        synchronized(this.$lock) {
            System.out.println("method()");
        }
    }
    private static void staticMethod() {
        synchronized($LOCK) {
            System.out.println("staticMethod()");
        }
    }
    public static void main(String[] args) {
    }
}

如果lock 和 / 或 是 lock和/或是lock和/或是LOCK自动生成的,则字段将使用一个空Object[]数组进行初始化,而不仅仅是new Object()显示该模式在实际使用中的大多数代码片段。Lombok这样做是因为新对象不可序列化,而0大小的数组则可序列化。因此,使用@Synchronized不会阻止您的对象被序列化。

@Synchronized类 中至少有一个方法意味着将有一个锁字段,但是如果以后删除所有这些方法,将不再有锁字段。这意味着您预定的serialVersionUID更改。如果您打算通过Java的序列化机制长期存储它们,我们建议您始终serialVersionUID向类中添加a 。如果这样做,@Synchronized从方法中删除所有注释不会破坏序列化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值