Итак, на Java я знаю, что вы можете использовать так называемую «внутреннюю блокировку» объектов для создания областей взаимного исключения, а также для обеспечения видимости памяти. Java делает его особенно легко неявным замок на внутренней замке this
объекта с некоторыми синтаксическими как:Можно ли использовать встроенную блокировку объекта Thread в Java?
public class Foo{
public synchronized doFoo(){
//doFoo is executed in an implicit synchronized block
//on the 'this' object
}
}
Это понятно и общепринятая практика для охраны полей член многих объектов. Что я не знаю, является ли это выше, когда объект, который заблокирован, является объектом Thread
. Например, есть ли причины, чтобы избежать следующего?
public class Bar extends Thread{ //notice the 'extends Thread' here
public synchronized doBar(){
//doBar is executed in an implicit synchronized block
//on the 'this' object
}
}
В настоящем время, я буду придерживаться чего-то я знаю, является более безопасным, например:
public class Baz extends Thread{ //notice the 'extends Thread' here
private final Object explicitLockObject = new Object();
public doBaz(){
synchronized(explicitLockObject){
//doBaz impl
}
}
}
Моих проблемы были бы два раза с опцией # 2 (Bar
примера):
- есть ли существующий код JVM или Java конвенции о синхронизации на резьбе, которые могут вступать в противоречие с такой блокировками?
- Блокировка на
this
обычно подразумевает, что доступ к этому объекту всегда должен быть защищен встроенной блокировкой этого объекта. В случае потокаBar
это означает, что мы подразумеваем, что в любое время, когда вы касаетесь нитиBar
, вы должны синхронизировать экземпляр. Кажется, что это может привести к тому, что некоторые другие потоки будут блокироваться без необходимости (или даже опасно) до тех пор, покаBar
не завершит/не удалит.
Являются ли вышеприведенные проблемы? Я чувствую, что нужен маяк Брайан Гетц для этого :-)
1. Ну, есть соглашение, в котором вы не должны распространять «Thread» в первую очередь: реализовать «Runnable», передать его в «Thread» как параметр конструктора (см. [Этот вопрос] (http : //stackoverflow.com/questions/541487/implements-runnable-vs-extends-thread)). Теперь вы беспокоитесь о синхронизации на «Runnable»? –
Да, я знаю об этом соглашении. Честно говоря, это не изначально мой код, и я не планирую рефакторинг. Я знаю, что «Runnable» будет в порядке, поскольку он не поставляется с государственным багажом. Но увы! Это не то, что у меня есть, и мне любопытно узнать ответ на этот вопрос. – codeCogs
Я бы рекомендовал, чтобы разработчики предпочитали новые классы в пакете параллелизма и не использовали необработанные потоки. Многопоточный код достаточно прост для записи. – duffymo