小编Jer*_*yJi的帖子

通过多线程调用的Spring @Transactional方法(多请求)

Java Web
Spring MVC框架

在服务级别,我编写了一个@Transactional方法。通过这种方法,我更新了数据库中的一些数据,然后稍后从数据库中读取数据。令我惊讶的是,当在同一线程内有多个请求到达时,数据更改是可见的(应该是),而数据更改在其他线程中不可见。
一种方法的不同线程不是作为一个事务构建的吗?
如果仍然要使用事务,并且希望在不同线程中调用的同一方法位于一个事务中,该怎么办(数据的变化可以彼此看到)?

java spring multithreading transactions spring-mvc

3
推荐指数
2
解决办法
3435
查看次数

如何证明i ++不是原子的

众所周知,i ++在java中不是原子的,所以我尝试编写一个程序来证明这一点.

我的想法是新增几个线程并在每个线程内部增加计数(这是Main类中的静态字段).

如果

  threadNum * iteration > count, 
Run Code Online (Sandbox Code Playgroud)

那么我们可以证明i ++不是原子的,但实际上我总是让它们相等.

这是我的代码:

import java.util.ArrayList;
import java.util.List;

public class  ConcurrentTest{
    private static int count = 0;

    public static void main(String[] args) throws Exception{
        List<Thread> threads = new ArrayList<>();
        for(int i = 0; i<12; ++i){
            threads.add(new Thread(() -> {
               for(int j=0; j<1000000; ++j) {
                   count++;
               }
            }));
        }
        for(Thread t: threads){
            t.start();
            t.join();
        }
        System.out.println(count);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是12000000.

并且无论我如何在上述程序中改变i和j, i*j === count.

我不知道这是否有用:这个程序已在JRE 6,7和8上测试过.我还没有在Java 5或更早版本中测试它.

java multithreading compare-and-swap

1
推荐指数
1
解决办法
81
查看次数