Один из вопросов практического экзамена SCJP, с которым я столкнулся, предоставил код в классе SafeDeposit. Ответ на вопрос утверждал, что если бы другой класс использовал несколько потоков, чтобы было невозможно для несинхронизированного (не потокового) метода getInstance() возвращать несколько экземпляров SafeDeposit. Я пробовал и пытался и не могу получить метод toString(), чтобы указать, что создается еще один экземпляр SafeDeposit. Я что-то упускаю, или это только одна из тех вещей, которые «могут» произойти, но действительно ли это действительно маловероятно?Как сделать публичный статический несинхронизированный метод getInstance() возвращать несколько экземпляров частной статической ссылочной переменной в объект?
class SafeDeposit {
private static SafeDeposit sd;
public static SafeDeposit getInstance() {
if(sd == null) sd = new SafeDeposit();
return sd;
}
private SafeDeposit() { }
}
public class PrivCon {
public static void main(String[] args) {
String checker;
SafeThief wizard = new SafeThief();
SafeThief wizard2 = new SafeThief();
for(int i = 0; i < 10; i ++) {
new Thread(wizard).start();
new Thread(wizard2).start();
}
}
}
class SafeThief implements Runnable {
public void run() {
System.out.println(SafeDeposit.getInstance().toString());
}
}
Спасибо, это действительно помогает. Я никогда не видел ничего похожего на ваш код разминки. Мне интересно посмотреть, как реализация чего-то подобного влияет на мои другие многопоточные упражнения. – paniclater
Он определенно влияет на все упражнения, которые пытаются обнаружить проблемы с видимостью записи. Однако обратите внимание, что этот код очень незначительный, и я даже начал задаваться вопросом, почему он работает так «хорошо»: 'println' - это синхронизированный метод, поэтому, как только вы его назовете, ваш поток будет синхронизирован * all * его память с остальной частью системы. –