问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Lombok注解详解:@Synchronized与@Locked的使用方法

创作时间:
作者:
@小白创作中心

Lombok注解详解:@Synchronized与@Locked的使用方法

引用
CSDN
1.
https://blog.csdn.net/tanglei6636/article/details/142535176

Lombok是一个用于Java的代码生成库,它通过注解来减少样板代码的编写。本文将介绍Lombok中的两个注解:@Synchronized和@Locked,它们分别用于实现同步锁和可重入锁。

@Synchronized

通过锁代码块的方式实现同步锁。

synchronized修饰类属性时,通常用于定义同步代码块,此时需要指定一个锁对象。这个锁对象通常是类的某个私有静态成员变量,因为类属性是静态的,所以锁也应该是静态的,以确保所有访问该属性的线程都使用同一个锁。

如何使用

  • 注解到需要保证线程安全的方法上。

代码示例

这里直接使用了Lombok官网的例子:

public class SynchronizedExample {
    private final Object readLock = new Object();
    @Synchronized
    public static void hello() {
        System.out.println("world");
    }
    @Synchronized
    public int answerToLife() {
        return 42;
    }
    @Synchronized("readLock")
    public void foo() {
        System.out.println("bar");
    }
}

编译后:为需要保证线程安全的代码生成了同步代码块的锁

@Locked

用于实现ReentrantLock(可重入锁)。

ReentrantLock也是Java当中提供的一种锁,这种锁和synchronized类似也可以起到互斥使用,它允许同一个线程在持有锁的情况下再次获取该锁(可重入性),保证线程安全。(ReentrantLock用起来非常简单,不了解的可以查一下ReentrantLock,,不仅方便的提供加锁、解锁方法,还提供了公平跟非公平的两种实现,本文主要介绍Lombok注解,因此不做赘述。)

如何使用

  • 注解到需要使用ReentrantLock的方法上。
  • 提供读、写、自定义三种级别。

代码示例

这里直接使用了Lombok官网的例子:

public class LockedExample {
    private int value = 0;
    private final Lock baseLock = new ReentrantLock();
    @Locked.Read
    public int getValue() {
        return value;
    }
    @Locked.Write
    public void setValue(int newValue) {
        value = newValue;
    }
    @Locked("baseLock")
    public void foo() {
        System.out.println("bar");
    }
}

编译后:生成了加锁、解锁、定义自定义锁的代码。

public class LockedExample {
    @Generated
    private final ReadWriteLock $lock = new ReentrantReadWriteLock();
    private int value = 0;
    private final Lock baseLock = new ReentrantLock();
    public LockedExample() {
    }
    public int getValue() {
        this.$lock.readLock().lock();
        int var1;
        try {
            var1 = this.value;
        } finally {
            this.$lock.readLock().unlock();
        }
        return var1;
    }
    public void setValue(int newValue) {
        this.$lock.writeLock().lock();
        try {
            this.value = newValue;
        } finally {
            this.$lock.writeLock().unlock();
        }
    }
    public void foo() {
        this.baseLock.lock();
        try {
            System.out.println("bar");
        } finally {
            this.baseLock.unlock();
        }
    }
}
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号