与spreed同步方法

时间:2017-02-27 13:11:15

标签: java mysql spring

我在网络应用程序中使用spring boot和mysql。

此应用程序使用tomcat

我需要生成一个将插入数据库的值。

我想避免在同一时间内有多个访问方法。

我想知道在弹簧中使用 synchronized 是否可以解决此问题。

1 个答案:

答案 0 :(得分:0)

您可以使用synchronized methodsynchronized block with single or multiple monitor lock来实现此目的。但是,还有其他一些方法:ExecutorService,Countdown latch, Producer-consumer approach etc。我建议你做一些研究,然后选择你认为合适的方法。

至于同步方法是关注的,这里我演示了两个线程调用常见方法 increment()的情况,并且该常用方法尝试更改共享数据计数器

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
  }
}

现在,尝试从方法synchronized中删除关键字increment(),重新编译代码并查看它产生的输出的性质。