% - это оператор форматирования строки (также известный как оператор интерполяции ), см. http://docs.python.org/library/stdtypes .html # строка форматирование
кто-либо может сказать мне преимущество синхронизированного метода по синхронизируемому блоку с примером? Спасибо.
нет ясного преимущества использования синхронизированного метода по блоку.
, Возможно, единственный (но я не назвал бы это преимуществом) является Вами, не должны включать Метод ссылки на объект this
.
:
public synchronized void method() { // blocks "this" from here....
...
...
...
} // to here
Блок:
public void method() {
synchronized( this ) { // blocks "this" from here ....
....
....
....
} // to here...
}
Посмотрите? Никакое преимущество вообще.
Блоки делают , имеют преимущества перед методами, хотя, главным образом в гибкости, потому что можно использовать другой объект в качестве блокировки, тогда как синхронизация метода заблокировала бы весь объект.
Сравните:
// locks the whole object
...
private synchronized void someInputRelatedWork() {
...
}
private synchronized void someOutputRelatedWork() {
...
}
по сравнению с [1 116]
// Using specific locks
Object inputLock = new Object();
Object outputLock = new Object();
private void someInputRelatedWork() {
synchronized(inputLock) {
...
}
}
private void someOutputRelatedWork() {
synchronized(outputLock) {
...
}
}
Также, если метод растет, можно все еще сохранить синхронизируемый раздел разделенным:
private void method() {
... code here
... code here
... code here
synchronized( lock ) {
... very few lines of code here
}
... code here
... code here
... code here
... code here
}
С синхронизируемыми блоками у Вас может быть несколько синхронизаторов, так, чтобы несколько одновременных, но неконфликтующих вещей могли продолжиться одновременно.
Примечание: статичный синхронизированные методы и блоки работают над Объектом класса.
public class MyClass {
// locks MyClass.class
public static synchronized void foo() {
// do something
}
// similar
public static void foo() {
synchronized(MyClass.class) {
// do something
}
}
}
Профессионалы:
Недостатки:
Профессионалы:
Недостатки:
Лично я предпочитаю использовать синхронизированные методы с классами, сфокусированными только к вещи синхронизация необходимости. Такой класс должен быть как можно меньше и таким образом, должно быть легко рассмотреть синхронизацию. Другие не должны должны быть заботиться о синхронизации.
Чаще всего я использую это для синхронизации доступа к списку или карте, но я не хочу блокировать доступ ко всем методам объекта.
В следующем коде один поток, изменяющий список, не заблокирует ожидание потока, который изменяет карту. Если бы методы синхронизировались на объекте затем, то каждый метод должен был бы ожидать даже при том, что модификации, которые они делают, не конфликтовали бы.
private List<Foo> myList = new ArrayList<Foo>();
private Map<String,Bar) myMap = new HashMap<String,Bar>();
public void put( String s, Bar b ) {
synchronized( myMap ) {
myMap.put( s,b );
// then some thing that may take a while like a database access or RPC or notifying listeners
}
}
public void hasKey( String s, ) {
synchronized( myMap ) {
myMap.hasKey( s );
}
}
public void add( Foo f ) {
synchronized( myList ) {
myList.add( f );
// then some thing that may take a while like a database access or RPC or notifying listeners
}
}
public Thing getMedianFoo() {
Foo med = null;
synchronized( myList ) {
Collections.sort(myList);
med = myList.get(myList.size()/2);
}
return med;
}
Единственная реальная разница - то, что синхронизируемый блок может выбрать, на каком объекте он синхронизируется. Синхронизированный метод может только использовать 'this'
(или соответствующий Экземпляр класса для синхронизируемого метода класса). Например, они семантически эквивалентны:
synchronized void foo() {
...
}
void foo() {
synchronized (this) {
...
}
}
последний более гибок, так как это может конкурировать за связанную блокировку любой объект, часто членская переменная. Это также более детализировано, потому что у Вас мог быть параллельный код, выполняющийся прежде и после блока, но все еще в рамках метода. Конечно, Вы могли столь же легко использовать синхронизированный метод путем рефакторинга параллельного кода в отдельные несинхронизированные методы. Используйте, какой бы ни делает код более понятным.
Основное различие - то, что при использовании синхронизируемого блока, можно соединить объект кроме это , который позволяет быть намного более гибким.
Предполагают, что у Вас есть очередь сообщений и несколько производителей сообщения и потребителей. Мы не хотим, чтобы производители вмешались друг в друга, но потребители должны смочь получить сообщения, не имея необходимость ожидать производителей. Таким образом, мы просто создаем объект
Object writeLock = new Object();
И с этого времени каждый раз, производители хотят добавить новое сообщение, мы просто соединяем это:
synchronized(writeLock){
// do something
}
, Таким образом, потребители могут все еще читать, и производители будут заблокированы.
В целом это главным образом то же кроме того, чтобы быть явным о мониторе объекта, это используется по сравнению с неявным этот объект. Одна оборотная сторона синхронизированных методов, что я думаю, иногда пропускается, то, что в использовании "этой" ссылки для синхронизации на Вас оставляют открытыми возможность внешних объектов, соединяющих тот же объект. Это может быть очень тонкой ошибкой при столкновении с нею. Синхронизация на внутреннем явном Объекте или другом существующем поле может избежать этой проблемы, полностью инкапсулируя синхронизацию.
Синхронизированный метод используется для блокировки всех объектов. Синхронизированный блок используется для блокировки определенного объекта