【每天学个新注解】Day 9 Lombok注解简解(八)—@Synchronized、@Locked

@Synchronized

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

1、如何使用

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

2、代码示例

例:这里直接使用了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注解,因此不做赘述。)

1、如何使用

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

2、代码示例

例:这里直接使用了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();
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值