hiện đơn giản an toàn chỉ đơn giản là không dễ hiểu với mọi bộ mã hóa, vì vậy tôi muốn tạo một lớp trong khung công tác của chúng tôi.Mẫu để tạo sự đơn giản an toàn cho thread đơn giản trong java
Bạn nghĩ sao về điều này? Bạn có thấy cái gì xấu về nó? Có cái gì đó tương tự như trong Apache Commons? Làm thế nào tôi có thể làm cho nó tốt hơn?
Supplier.java
public interface Supplier<T> {
public T get();
}
LazyThreadSafeInstantiator.java
public class LazyThreadSafeInstantiator<T> implements Supplier<T> {
private final Supplier<T> instanceSupplier;
private volatile T obj;
public LazyThreadSafeInstantiator(Supplier<T> instanceSupplier) {
this.instanceSupplier = instanceSupplier;
}
@Override
// http://en.wikipedia.org/wiki/Double-checked_locking
public T get() {
T result = obj; // Wikipedia: Note the usage of the local variable result which seems unnecessary. For some versions of the Java VM, it will make the code 25% faster and for others, it won't hurt.
if (result == null) {
synchronized(this) {
result = obj;
if (result == null) {
result = instanceSupplier.get();
obj = result;
}
}
}
return result;
}
}
sử dụng Ví dụ:
public class Singleton1 {
private static final Supplier<Singleton1> instanceHolder =
new LazyThreadSafeInstantiator<Singleton1>(new Supplier<Singleton1>() {
@Override
public Singleton1 get() {
return new Singleton1();
}
});
public Singleton1 instance() {
return instanceHolder.get();
}
private Singleton1() {
System.out.println("Singleton1 instantiated");
}
}
Cảm ơn
Vấn đề lớn nhất của tôi là với chính mẫu đó. Từ Wikipedia: Một số xem xét nó là một anti-pattern, đánh giá rằng nó bị lạm dụng, giới thiệu những hạn chế không cần thiết trong các tình huống mà một trường hợp duy nhất của một lớp là không thực sự cần thiết, và giới thiệu trạng thái toàn cầu vào một ứng dụng. Cân nhắc sử dụng tính năng tiêm phụ thuộc thay thế. –
Tôi rất muốn đề nghị tránh một cái gì đó như thế này. Sử dụng khung DI thay thế. –
có thể trùng lặp của [mẫu Singleton trong java- lười biếng Intialization] (http://stackoverflow.com/questions/2521895/singleton-pattern-in-java-lazy-intialization) –