单例模式在高并发情形下造成的访问覆盖问题

本文通过实例分析了在高并发环境下,单例模式中静态变量可能导致的访问覆盖问题,特别是在缓存操作中的表现。在并发线程对同一静态变量进行修改时,后续线程可能会获取到被修改后的值,而非预期的初始值。为了解决这个问题,文章提出通过复制公共变量的副本来避免线程间的相互影响,确保每个线程看到的都是最初的变量状态,从而解决了并发问题。
摘要由CSDN通过智能技术生成

好吧,最近我特么是跟高并发杠上了眨眼。。

单例模式想必很很常见,而往往单例模式跟static相关。单例模式的初衷是为了在任何条件下我只得到一个实例,包括类和变量。而往往需要我们用static关键字去修饰达到单例的效果。最近高并发接触得比较多,使用缓存就需要用单例。因为你针对某一个key的缓存只可能定义成“一份”。所以缓存类的实例需要用到单例模式。但是在高并发的条件下,控制不好的话,很容易出问题。下面写个小例子,就能看出是什么问题了……

@Controller
public class TestAction {
	
	@RequestMapping("/test/context.json")
	@ResponseBody
	public void test() {
	
		Thread t  = Thread.currentThread();

		new Thread(new TestThread("count")).start();
		
		try {
			t.sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		new Thread(new TestThread("count")).start();
		
	}
}

class TestThread implements Runnable{
	
	private String attr;
	
	public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值