Java结合Junit做并发测试用例。

1:上一篇博文,介绍了Synchronized 和 配合Spring @Transtaction使用。下面咱们做一个测试。

 

2:在做并发测试前,可以预先设计使用线程池的execute方法、还是submit,虽然submit方法最后还是调用了线程池的execute;但submit方法封装了一个返回Future的值。

 

3:测试代码

 

public class MultiThreadTestCase extends AbstractSpringContextTestSupport {

	@Autowired
	SynchronizedNoTransService synchronizedNoTransService;
	
	@Autowired
	SynchronizedService synchronizedService;
	
	@Test
	public void testUpdateBalance() throws Exception {
		int threadCount = 2;
		ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
		
		List<Future<Integer>> futures = new ArrayList<Future<Integer>>();
		
		for (int x = 0; x < threadCount; x++) { 
			Callable<Integer> callable = new Callable<Integer>() {
				@Override
				public Integer call() throws Exception {
					synchronizedService.synMethodTwo();
					return 1;
				}
			};
			Future<Integer> submit = executorService.submit(callable);
			futures.add(submit);
		}

		List<Exception> exceptions = new ArrayList<Exception>();
		for (Future<Integer> future : futures) {
			try {
				future.get();
			} catch (Exception e) {
				exceptions.add(e);
				e.printStackTrace(System.err);
			}
		}
	}
	
}

 

SynchronizedService中synMethodTwo的方法,业务逻辑处理最后是更新账户信息;此时会出现并发可能。

 

(1)相同的数据并发更新。

         可以考虑同步方法设计。

 

(2)不同的数据并发更新

        

         不同数据并发更新账户信息,由于Spring data jpa 维护了version 版本的信息,在遍历线程池submit返回的Future,future.get()方法时,可以看到Console信息两个异常信息,StaleObjectStateException和ObjectOptimisticLockingFailureException异常信息。

        

         该问题的解决方法,可能要从业务设计上或者多任务并发编程上下点功夫,目前我还对这种高并发没有策略。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值