Javaでマルチスレッドのデータ共有をどう実現しますか?

Javaのマルチスレッドデータ共有は、次の方法で実現できます:

  1. 同期されました。
public class SharedData {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

public class MyThread implements Runnable {
    private SharedData sharedData;

    public MyThread(SharedData sharedData) {
        this.sharedData = sharedData;
    }

    public void run() {
        sharedData.increment();
    }
}

public class Main {
    public static void main(String[] args) {
        SharedData sharedData = new SharedData();
        Thread thread1 = new Thread(new MyThread(sharedData));
        Thread thread2 = new Thread(new MyThread(sharedData));

        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(sharedData.getCount());
    }
}
  1. 同期化されました。
public class SharedObject {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

public class MyThread implements Runnable {
    private SharedObject sharedObject;

    public MyThread(SharedObject sharedObject) {
        this.sharedObject = sharedObject;
    }

    public void run() {
        sharedObject.increment();
    }
}

public class Main {
    public static void main(String[] args) {
        SharedObject sharedObject = new SharedObject();
        Thread thread1 = new Thread(new MyThread(sharedObject));
        Thread thread2 = new Thread(new MyThread(sharedObject));

        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(sharedObject.getCount());
    }
}
  1. ベクトル
  2. ハッシュテーブル
  3. ConcurrentHashMapは、並列処理で安全に使用できるMapの一種です。
import java.util.concurrent.ConcurrentHashMap;

public class MyThread implements Runnable {
    private ConcurrentHashMap<String, Integer> map;

    public MyThread(ConcurrentHashMap<String, Integer> map) {
        this.map = map;
    }

    public void run() {
        map.put("count", map.get("count") + 1);
    }
}

public class Main {
    public static void main(String[] args) {
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
        map.put("count", 0);

        Thread thread1 = new Thread(new MyThread(map));
        Thread thread2 = new Thread(new MyThread(map));

        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(map.get("count"));
    }
}

多様なスレッドでのデータ共有は、スレッドセーフの問題を引き起こす可能性があるため、データの整合性と正確性を保証するために適切な同期メカニズムを取る必要があります。Javaでは、よく使われる同期メカニズムには、synchronizedキーワード、Lockインターフェイス、volatileキーワードなどがあります。

bannerAds