@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();
}
}
}