multithreading - Lombok 的构建器线程安全吗?

标签 multithreading thread-safety builder lombok

我有一个简单的对象

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

看着这个,我看到 builder 是我的 Address 类的一些静态内部类。

假设我有 2 个线程使用 builder并行执行。

第一个线程创建这个局部变量
Address address = Address.builder()
    .id(1L)
    .street("street 1")
    .build();

第二个创建这个本地的
Address address = Address.builder()
    .id(2L)
    .street("street 2")
    .build();

查看使用静态类的 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();
}   
}

vmlens ,一种检测竞态条件的工具,它没有像预期的那样发现任何竞态。

单元测试中使用的 ConcurrentTestRunner 使用 4 个线程并行运行测试方法。

关于multithreading - Lombok 的构建器线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49168589/

相关文章:

java - java线程数>内核数和垃圾回收

java - 对不同的数据库建立不同的连接并将其放入列表中

c - Intel i5 处理器中的线程数

java - 凋零 vs 生成器 Lombok 库

java - 如何通过不断监听套接字来释放由Thread持有的互斥锁,该互斥锁永不松开

Java 线程执行受计数和时间限制

c# - 进度条在 winform 中卡住

c# - StringBuilder类的线程安全

c++ - 如何在 C++ Builder 6 中发送广播消息

ruby-on-rails - Rails+Builder. 生成没有实体的 XML 输出