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