Автор пишет,что В методе method0 используется только одна операция присваивания и она АТОМАРНАЯ. Но тип LONG И DOUBLE НЕ АТОМАРНЫ!!!
ИЛИ Я НЕ ПРАВ?
public class Solution {
private double param = Math.random();
private StringBuilder sb = new StringBuilder();
private synchronized void method0() {
Double d = method3();
}
protected void method1(String param1) {
Solution solution = new Solution();
solution.method0();
}
public void method2(int param1) {
param1++;
}
synchronized double method3() {
double random = Math.random();
param += 40.7;
return random + param;
}
private synchronized void method4() {
sb.append(1).append(1).append(1).append(1);
}
protected void method5(String param2) {
new StringBuffer().append(param2).append(param2).append(param2);
}
public synchronized String method6(int param2) {
System.out.println("Thinking....");
method7(5e-2);
sb = new StringBuilder("Got it!.");
return sb.toString();
}
String method7(double param2) {
return "" + param2;
}
public static void main(String[] args) {
}
}package com.javarush.task.task17.task1716;
/*
Синхронизированные методы
*/
public class Solution {
private double param = Math.random();
private StringBuilder sb = new StringBuilder();
private synchronized void method0() {
Double d = method3();
}
protected void method1(String param1) {
Solution solution = new Solution();
solution.method0();
}
public void method2(int param1) {
param1++;
}
synchronized double method3() {
double random = Math.random();
param += 40.7;
return random + param;
}
private synchronized void method4() {
sb.append(1).append(1).append(1).append(1);
}
protected void method5(String param2) {
new StringBuffer().append(param2).append(param2).append(param2);
}
public synchronized String method6(int param2) {
System.out.println("Thinking....");
method7(5e-2);
sb = new StringBuilder("Got it!.");
return sb.toString();
}
String method7(double param2) {
return "" + param2;
}
public static void main(String[] args) {
}
}
longиdoubleгарантируется только если они объявлены с модификаторомvolatile. Только доступ к ссылкам всегда атомарен, вне зависимости от разрядности. Но в методеmethod0используется локальная переменная типаDouble. Во-первых эта переменная локальна для метода, и потому никогда не видна другим потокам, во-вторых объекты типаDoubleиммутабельны, и Вам нет нужды использовать синхронизацию при многопоточном доступе к таким объектам. В-третьих это не примитивdouble, а переменная ссылочного типа, а чтение, или запись ссылок - это всегда атомарная операция.