Java同步问题

2 篇文章 0 订阅

我一直在想念着你,不管你是否知道~


        前阵子,看来一个关于数据库连接池的一个开源项目(miniConnectionPoolManager),之前知道并发情况下,保持同步是一个非常重要的,但是可能是对同步概念的缺失,

并没有如何好地理解以及实践,以至于在看这个连接池的时候,并没有过多关注项目中有关同步的地方,只是稍微注意了下里面的修饰词synchronized以及Semaphore类。直

到被面试官提到数据库连接池中最重要的一个点就是多线程并发的同步问题,由于这个方面的只是确实有缺陷,所以去看了下传智播客多线程的专题,感觉还是不错了。反正晚

上不怎么睡得着,写写记录下。

问题:

当多个线程操作同一个数据的时候,加入都只是读取数据的话,那么并没有问题,而如果这个过程是不仅有读还有写的话,那么问题就会很大。

如同数据库事务并发:

1:丢失更新

2:脏读

3:虚读

4:不可重复读

而在这里我认为,我们在没有对数据库进行操作的时候,所以并没有存在回滚或提交遇到的问题,我们遇到的应该是“读脏数据”这个问题。

解决方案:

加上同步锁;

在java中可以使用的方案:

1:使用修饰词synchronized

这里需要注意的是:不管synchronized针对的是方法还是代码块,它都是有个参照的:

当时方法的时候,这是其实参照的是当前对象this

	public synchronized void doSome(){
		//...
	}
         而同步代码块的参照则更具备灵活性,可以一样是this或者是类.class其他等

	public void doSome(){
		synchronized(参照){
                    //...
                }
	}

2:接口Lock(java.util.concurrent.locks)

实现类有:

ReentranLock :这个与修饰词synchronized的作用是一样的

	public void doSome(){
          	 lock.lock();
		 //需要加锁的内容
           	 lock.unlock();
	}

ReentranReadWriteLock.ReadLock  读锁,在加了这个锁的情况是允许其他的线程执行读取操作的。

ReentranReadWriteLock.WriteLock  写锁,在加了这个锁的情况,只允许加锁者执行相应的操作,不允许其他线程执行任何的操作、

上述两的用法与Lock是相同的,只要将要加锁的部分保卫起来即可,使用锁,其实更易理解。
====================================================================================================================================总结:
其实两者并没有多大的区别的,不管是修饰词还是类的使用,就是相当于给共享数据加上同步锁(当然可能还分是哪种类别的锁),给需要保护的部分相应的范围加上锁。相比较而言,个人觉得使用Lock更容易接受,以及面向对象。修饰词则需要注意参照对象的的选取。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值