Java и synchronized в однопоточной среде

178
14 декабря 2019, 20:40

Всем привет!

Подскажите пожалуйста, часто пишут что методы использующие оператор synchronized являются медленными и для многопоточной среды это понятно. Потоки как будто выстраиваются в ряд и ждут своей очереди, но как это может повлиять на работу когда запущен только один - главный поток, а других претендентов нет?

Answer 1

Конечно же ничего не бывает бесплатно.

synchronized метод отмечается на уровне структуры method_info флагом ACC_SYNCHRONIZED и байт-код от этого не сильно вырастает

метод:

public synchronized int top1(){
  return intArr[0];
}

байт код:

Method int top1()
   0 aload_0 
   1 getfield #6 <Field int intArr[]>
   4 iconst_0      
   5 iaload         
   6 ireturn        

synchronized блок же будет содержать инструкции синхронизации

метод:

public int top2(){
 synchronized (this) {
  return intArr[0];
 }
}

байт-код:

Method int top2()
   0 aload_0    
   1 astore_2               
   2 aload_2         
   3 monitorenter           
   4 aload_0                
   5 getfield #6 <Field int intArr[]>
   8 iconst_0         
   9 iaload                       
  10 istore_1                       
  11 jsr 19                     
  14 iload_1                           
  15 ireturn                           
  16 aload_2                           
  17 monitorexit                     
  18 athrow                        
  19 astore_3                     
  20 aload_2                 
  21 monitorexit             
  22 ret 3         

Как видно добавление synchronized блоков точно замедлит выполнение этих участков больше чем synchronized методы.

Подробнее о том, как работает синхронизация

READ ALSO
Как сократить данный участок кода или можно ли в java передать метод в качестве параметра метода?

Как сократить данный участок кода или можно ли в java передать метод в качестве параметра метода?

У меня есть 3 метода и для каждого прописаны одни и те же участки кодакак сократить данный участок кода?

218
Загрузка рекламы в приложении

Загрузка рекламы в приложении

У меня есть приложение на androidЕсть реклама за вознаграждения (использую appodeal) В слушателе такой код

170
как в процессе ввода записать записать информацию в строку?

как в процессе ввода записать записать информацию в строку?

Нужна помощь, как в процессе ввода записать все стрелки в строку, и вывести их в консоль после цикла ?

174
Как изменить ориентацию игры LibGDX на вертикальную?

Как изменить ориентацию игры LibGDX на вертикальную?

Как изменить ориентацию игры LibGDX на вертикальную?

175