我在网络应用程序中使用spring boot和mysql。
此应用程序使用tomcat
我需要生成一个将插入数据库的值。
我想避免在同一时间内有多个访问方法。
我想知道在弹簧中使用 synchronized 是否可以解决此问题。
答案 0 :(得分:0)
您可以使用synchronized method
或synchronized 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()
,重新编译代码并查看它产生的输出的性质。