Я пытаюсь использовать объект String в качестве блокировки (да, я знаю, что это не рекомендуется - это только для понимания блокировок).synchronized зависит от инициализации строки
при инициализации блокировки при его создании, все работает хорошо:
код:
public class Action{
String lock = new String("hello");
@Override
public String myAction(long threadId){
synchronized (lock) {
i++;
printToLog("thread " + threadId);
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
printToLog("Thread "+threadId+ " could not sleep "+ e.getMessage() + "\n");
}
printToLog("Thread "+threadId+ " slept well! ");
}
return i+"";
}
private void printToLog(String messege) {
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//get current date time with Date()
Date date = new Date(System.currentTimeMillis());
logger.info(messege + " at time: "+dateFormat.format(date));
}
}
журналы:
[нить 555 на время: 2015/02/18 18: 16:03]
[Thread 555 хорошо спал! во время: 2015/02/18 18:17:43]
[thread 557 at time: 2015/02/18 18:17:43]
[Thread 557 спал хорошо! во время: 2015/02/18 18:19:23]
[thread 556 at time: 2015/02/18 18:19:23]
[Thread 556 хорошо спал! во время: 2015/02/18 18:21:03]
но когда я инициализирую блокировку члена экземпляра в методе, это как если синхронизация не работает.
код:
public class Action{
String lock;
@Override
public String myAction(long threadId){
lock = new String("hello");
synchronized (lock) {
i++;
printToLog("thread " + threadId);
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
printToLog("Thread "+threadId+ " could not sleep "+ e.getMessage() + "\n");
}
printToLog("Thread "+threadId+ " slept well! ");
}
return i+"";
}
private void printToLog(String messege) {
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//get current date time with Date()
Date date = new Date(System.currentTimeMillis());
logger.info(messege + " at time: "+dateFormat.format(date));
}
}
журналы:
[нить 555 на время: 2015/02/18 19:17:35]
[нить 556 на время: 2015/02/18 19:17:40]
[thread 556 at time: 2015/02/18 19:17:41]
[thread 557 at time: 2015/02/18 19:17:44]
[thread 560 на момент: 2015/02/18 19:17:48]
[Thread 555 хорошо спал! во время: 2015/02/18 19:19:15]
[Thread 556 спал хорошо! во время: 2015/02/18 19:19:20]
[Thread 556 хорошо спал! во время: 2015/02/18 19:19:21]
[Thread 557 спал хорошо! во время: 2015/02/18 19:19:24]
[Thread 560 хорошо спал! во время: 2015/02/18 19:19:28]
Я не понимаю, что такое меттер, где я начинаю объект? more - это строковый объект, так что в любом случае это не должно быть одной и той же ссылкой? что я скучаю?
Edit: Да, я случайно поменять код .. это то, что происходит, когда вы получаете «ваш пост, как представляется, содержат код, который не правильно отформатированный в качестве кода» слишком много раз, а затем выяснить, это было связано войти линии: | зафиксирует своп.
Что вы подразумеваете под «когда я инициализирую метод». Можете ли вы опубликовать код, который создает и запускает потоки для этих двух случаев? – CKing
В вашем первом примере ваш метод 'myAction' создает каждый раз отдельный объект блокировки, поэтому я не останавливаю использование других потоков, так как при использовании этого метода у всех из них будут новые блокировки. Во втором случае только один поток сможет ввести синхронизированный блок, потому что будет существовать только одна блокировка, созданная до вызова метода. Другими словами, вы можете удалить механизм блокировки и синхронизации из первого примера кода, и вы должны иметь одинаковые результаты. – Pshemo
@Moria: вы случайно - замените два фрагмента кода? –