关于并发

今天遇到多线程并发访问数据库的问题,思来想去,只好对临界区加锁,通过synchronized关键字。

问题来了,我改对什么加锁?

根据实际情况,是想对某个临界区(也就是一段代码)加锁,但是加锁的对象是资源,而不是代码啊。所以考虑将这段代码弄成一个方法,对方法加同步锁。

可是方法也不是资源啊,对方法加锁的实质是什么呢?其实对方法加锁是对方法所属资源的加锁,如果是静态方法,那么其实是锁了他的类型,如果是普通方法,那其实是锁了类的对象。

那么,锁住某个对象,能避免并发吗?不难发现,对于非单例的对象,多线程中必定是2个不同的实例,所以锁了也没什么意义。

但是如果这个类是单例模式,那就有用了,因为每个线程获取的实例是同一个。

如果不是单例,又要达到这样的效果,那只好为类增加一个静态属性,然后锁住这个静态属性,使得不同实例见能同步

原文地址:https://www.cnblogs.com/glgl2424/p/2889278.html