Lombok 的构建器线程安全吗?
Is Lombok's builder thread safe?
我有一个简单的对象
@Data
@Builder
public class Address {
private Long id;
private String street;
}
我制作了 @Builder
注释的 delombok,我看到生成了下一个代码
@Data
public class Address {
private Long id;
private String street;
@java.beans.ConstructorProperties({"id", "street"})
Address(Long id, String street) {
this.id = id;
this.street = street;
}
public static AddressBuilder builder() {
return new AddressBuilder();
}
public static class AddressBuilder {
private Long id;
private String street;
AddressBuilder() {
}
public AddressBuilder id(Long id) {
this.id = id;
return this;
}
public AddressBuilder street(String street) {
this.street = street;
return this;
}
public Address build() {
return new Address(id, street);
}
public String toString() {
return "Address.AddressBuilder(id=" + this.id + ", street=" + this.street + ")";
}
}
}
看到这个,我看到构建器是我的地址 class 的一些静态内部 class。
假设我有 2 个使用 builder
并行执行的线程。
第一个线程创建这个局部变量
Address address = Address.builder()
.id(1L)
.street("street 1")
.build();
第二个创建这个本地的
Address address = Address.builder()
.id(2L)
.street("street 2")
.build();
查看使用静态 classes 的 lombok 的实现是否有可能并行 运行 我有时会在其中一个线程中有一个对象 id=1L street="street 2"
或 id=2L street="street 1"
?
它是线程安全的。在方法构建器中创建了一个新的 AddressBuilder 对象,因此它始终使用一个新对象。这些方法只使用局部变量,没有共享变量。
为了测试这个,我写了下面的单元测试:
import com.anarsoft.vmlens.concurrent.junit.ConcurrentTestRunner;
@RunWith(ConcurrentTestRunner.class)
public class TestLombok {
@Test
public void testOne()
{
Address address = Address.builder()
.id(1L)
.street("street 1")
.build();
}
@Test
public void testTwo()
{
Address address = Address.builder()
.id(2L)
.street("street 2")
.build();
}
}
with vmlens,一个检测竞态条件的工具,它没有像预期的那样发现任何竞态。
单元测试中使用的ConcurrentTestRunner是运行4线程并行的测试方法
我有一个简单的对象
@Data
@Builder
public class Address {
private Long id;
private String street;
}
我制作了 @Builder
注释的 delombok,我看到生成了下一个代码
@Data
public class Address {
private Long id;
private String street;
@java.beans.ConstructorProperties({"id", "street"})
Address(Long id, String street) {
this.id = id;
this.street = street;
}
public static AddressBuilder builder() {
return new AddressBuilder();
}
public static class AddressBuilder {
private Long id;
private String street;
AddressBuilder() {
}
public AddressBuilder id(Long id) {
this.id = id;
return this;
}
public AddressBuilder street(String street) {
this.street = street;
return this;
}
public Address build() {
return new Address(id, street);
}
public String toString() {
return "Address.AddressBuilder(id=" + this.id + ", street=" + this.street + ")";
}
}
}
看到这个,我看到构建器是我的地址 class 的一些静态内部 class。
假设我有 2 个使用 builder
并行执行的线程。
第一个线程创建这个局部变量
Address address = Address.builder()
.id(1L)
.street("street 1")
.build();
第二个创建这个本地的
Address address = Address.builder()
.id(2L)
.street("street 2")
.build();
查看使用静态 classes 的 lombok 的实现是否有可能并行 运行 我有时会在其中一个线程中有一个对象 id=1L street="street 2"
或 id=2L street="street 1"
?
它是线程安全的。在方法构建器中创建了一个新的 AddressBuilder 对象,因此它始终使用一个新对象。这些方法只使用局部变量,没有共享变量。
为了测试这个,我写了下面的单元测试:
import com.anarsoft.vmlens.concurrent.junit.ConcurrentTestRunner;
@RunWith(ConcurrentTestRunner.class)
public class TestLombok {
@Test
public void testOne()
{
Address address = Address.builder()
.id(1L)
.street("street 1")
.build();
}
@Test
public void testTwo()
{
Address address = Address.builder()
.id(2L)
.street("street 2")
.build();
}
}
with vmlens,一个检测竞态条件的工具,它没有像预期的那样发现任何竞态。
单元测试中使用的ConcurrentTestRunner是运行4线程并行的测试方法