2017-02-27 2 views
0

私は、Webアプリケーションでspring bootとmysqlを使用します。spreedとメソッドの同期

このアプリケーションの使用のTomcat

私はデータベースに挿入される値を生成する必要があります。

複数のトレッドを同時にアクセスする方法は避けたいです。

を使用している場合は、と同期してこの問題を解決する方法を知りたいと思います。

+2

要件を理解するためのコードを追加してください。 –

+0

あなたがSpringとデータベースを持っているとき、 'synchronized'はほとんど決して行きません。あなたは取引をしたい。 – john16384

答えて

0

これを実現するには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()、コードを再コンパイルし、それが生成する出力の性質を参照してくださいからキーワード​​を削除してみてください。

関連する問題