碰到一個問題就是想要使用兩個對象鎖控制同一個類的兩個方法在多線程環境的同步問題。目標是兩個方法可以同時由不同的線程獲取不同的鎖同時執行,互不影響。通過定義兩個String對象作爲對象鎖存在的問題。
如果用兩個String變量使用相同的字面量定義
由於代碼中定義的字面量編譯後在字符串常量池中引用的都是相同的對象,因此實際上兩個String對象是同一對象鎖
所以使用String對象做Synchronized同步鎖時要注意定義方式,最好通過new的方式。
package com.teriste.thread;
public class StringSyncTest {
static class OpString{
/**
* 目標是通過s1和s2兩個對象作爲鎖控制op1和op2多線程環境下的安全性
* 1、s1和s2通過字面量賦值,由於引用的常量池中相同的對象導致沒有實現兩個鎖分別控制方法線程安全的目標
* 2、通過new的方式使用不同對象來達到兩個方法多線程環境下分別鎖兩個對象
* String s1 = new String("aaa");
* String s2 = new String("aaa");
*/
String s1 = "aaa";
String s2 = "aaa";
/**
* 方法一通過對象s1作爲鎖控制多線程併發
*/
public void op1(){
synchronized (s1){
while (true){
System.out.println("T1");
}
}
}
/**
* 方法二通過對象s2作爲鎖控制多線程併發
*/
public void op2(){
synchronized (s2){
while (true){
System.out.println("T2");
}
}
}
}
public static void main(String[] args) {
OpString opString = new OpString();
Thread t1 = new Thread(opString::op1,"t1");
Thread t2 = new Thread(opString::op2,"t2");
t1.start();
t2.start();
}
}