Lombok之@Synchronized使用

一. 为什么要用@Synchronized?

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

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

二. @Synchronized如何使用?

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

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

三. @Synchronized源码

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Synchronized {
          
   
	/**
	 * Optional: specify the name of a different field to lock on. It is a compile time error if this field
	 * doesnt already exist (the fields are automatically generated only if you dont specify a specific name.
	 * 
	 * @return Name of the field to lock on (blank = generate one).
	 */
	String value() default "";
}

注解属性:value是指自定义锁的字段名。

四. 特别说明

经验分享 程序员 微信小程序 职场和发展