今天遇到多线程并发访问数据库的问题,思来想去,只好对临界区加锁,通过synchronized关键字。
问题来了,我改对什么加锁?
根据实际情况,是想对某个临界区(也就是一段代码)加锁,但是加锁的对象是资源,而不是代码啊。所以考虑将这段代码弄成一个方法,对方法加同步锁。
可是方法也不是资源啊,对方法加锁的实质是什么呢?其实对方法加锁是对方法所属资源的加锁,如果是静态方法,那么其实是锁了他的类型,如果是普通方法,那其实是锁了类的对象。
那么,锁住某个对象,能避免并发吗?不难发现,对于非单例的对象,多线程中必定是2个不同的实例,所以锁了也没什么意义。
但是如果这个类是单例模式,那就有用了,因为每个线程获取的实例是同一个。
如果不是单例,又要达到这样的效果,那只好为类增加一个静态属性,然后锁住这个静态属性,使得不同实例见能同步