在Java中,線程同步是通過使用synchronized關(guān)鍵字來實(shí)現(xiàn)的。synchronized關(guān)鍵字可以用于修飾方法或者以代碼塊的形式出現(xiàn),確保多個(gè)線程訪問共享資源時(shí)不會出現(xiàn)數(shù)據(jù)不一致的問題。
以下是使用synchronized關(guān)鍵字實(shí)現(xiàn)線程同步的兩種方式:
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized void decrement() {
count--;
}
public synchronized int getCount() {
return count;
}
}
在上面的例子中,我們定義了一個(gè)Counter類,它有一個(gè)整數(shù)類型的成員變量count。我們使用synchronized關(guān)鍵字修飾了increment()、decrement()和getCount()方法,確保在同一時(shí)刻只有一個(gè)線程可以訪問這些方法。
public class Counter {
private int count = 0;
private final Object lock = new Object();
public void increment() {
synchronized (lock) {
count++;
}
}
public void decrement() {
synchronized (lock) {
count--;
}
}
public int getCount() {
synchronized (lock) {
return count;
}
}
}
在上面的例子中,我們定義了一個(gè)Counter類,它有一個(gè)整數(shù)類型的成員變量count和一個(gè)Object類型的成員變量lock。我們使用synchronized關(guān)鍵字修飾了increment()、decrement()和getCount()方法中的代碼塊,同時(shí)使用lock對象作為鎖。這樣,在同一時(shí)刻只有一個(gè)線程可以獲取到lock對象的鎖,從而訪問共享資源count。
需要注意的是,在使用synchronized關(guān)鍵字實(shí)現(xiàn)線程同步時(shí),需要確保鎖對象的唯一性和可見性。通常情況下,我們會使用一個(gè)私有的靜態(tài)對象作為鎖,以確保在整個(gè)類中只有一個(gè)鎖對象。同時(shí),需要注意避免死鎖等問題,合理地安排鎖的獲取順序和釋放順序。