私は、Webアプリケーションでspring bootとmysqlを使用します。spreedとメソッドの同期
このアプリケーションの使用のTomcat
私はデータベースに挿入される値を生成する必要があります。
複数のトレッドを同時にアクセスする方法は避けたいです。
を使用している場合は、と同期してこの問題を解決する方法を知りたいと思います。
私は、Webアプリケーションでspring bootとmysqlを使用します。spreedとメソッドの同期
このアプリケーションの使用のTomcat
私はデータベースに挿入される値を生成する必要があります。
複数のトレッドを同時にアクセスする方法は避けたいです。
を使用している場合は、と同期してこの問題を解決する方法を知りたいと思います。
これを実現するにはsynchronized method
またはsynchronized block with single or multiple monitor lock
を使用できます。しかし、他の方法があります:ExecutorService,Countdown latch, Producer-consumer approach etc
。私はあなたにいくつかの調査を行い、説得力のある適切なアプローチを選ぶことをお勧めします。同期方法として
は、ここでは、2つのスレッドが一般的な方法増加を呼び出し状況()を示し、一般的な方法は、スレッド間で共有データカウンタを変更しようとするが、懸念されます。今
public class App {
// this is a shared data between two threads.
private int counter = 0;
//this method is invoked from both threads.
private synchronized void increment() {
counter++;
}
public static void main(String[] args) {
App app = new App();
app.doWork();
}
private void doWork() {
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
increment();
}
});
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
increment();
}
});
thread1.start();
thread2.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" The counter is :" + counter);
//output shoud be equal to : 20000
}
}
、方法increment()
、コードを再コンパイルし、それが生成する出力の性質を参照してくださいからキーワードを削除してみてください。
要件を理解するためのコードを追加してください。 –
あなたがSpringとデータベースを持っているとき、 'synchronized'はほとんど決して行きません。あなたは取引をしたい。 – john16384