實例級別的鎖 實例代碼 @Slf4j public class AddCompareDemo { private int a, b; public void add() { for (int i = 0; i < 10000; i++) { a++; b++; } } public void com ...
實例級別的鎖
實例代碼
@Slf4j public class AddCompareDemo { private int a, b; public void add() { for (int i = 0; i < 10000; i++) { a++; b++; } } public void compare() { for (int i = 0; i < 10000; i++) { if (a < b) { log.info("a:{},b:{},{}", a, b, a > b); } } } }
執行
@SpringBootApplication public class NewdemoApplication { public static void main(String[] args) throws Exception { SpringApplication.run(NewdemoApplication.class, args); AddCompareDemo demo = new AddCompareDemo(); new Thread(() -> { demo.add(); }).start(); new Thread(() -> { demo.compare(); }).start(); } }
執行結果
INFO 39336 --- [ Thread-30] com.example.newdemo.AddCompareDemo : a:5262,b:5894,true
解決
這是同一個實例之間的行程安全問題。在方法上增加synchronize欄位
@Slf4j public class AddCompareDemo { private int a, b; public synchronized void add() { for (int i = 0; i < 10000; i++) { a++; b++; } } public synchronized void compare() { for (int i = 0; i < 10000; i++) { if (a < b) { log.info("a:{},b:{},{}", a, b, a > b); } } } }
即可解決問題
類級別
代碼
public class ClassLevelSyncDemo {
private static int data;//類基本靜態欄位
public synchronized void count() {//此處預設是實例級別的鎖
data++;
}
public static int getData() {
return data;
}
}
執行
@SpringBootApplication @Slf4j public class NewdemoApplication { public static void main(String[] args) throws Exception { SpringApplication.run(NewdemoApplication.class, args); IntStream.rangeClosed(1, 100000).parallel().forEach(i -> { new ClassLevelSyncDemo().count(); }); log.info("" + ClassLevelSyncDemo.getData()); } }
執行結果
28988 不是100000.
解決方法
1 public class ClassLevelSyncDemo { 2 3 private static int data;//類基本靜態欄位 4 private static Object object = new Object(); 5 6 public void count() { 7 synchronized (object) { 8 data++; 9 } 10 } 11 12 public static int getData() { 13 return data; 14 } 15 }