java多线程学习

CyclicBarrier

在java多线程中,很多时候需要相互等到别的线程做了某见事情,其他线程才能进入下一步,一种方式是通过wait(),和notifyall的方式,但还有比这种更好的方式吗?
这就要靠java.util.concurrent包中的CyclicBarrier类了。它是一个同步辅助类,它允许一组线程(任务)互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程(任务)的程序中,这些线程(任务)必须不时地互相等待,此时 CyclicBarrier 很有用。简单的概括其适应场景就是:当一组线程(任务)并发的执行一件工作的时候,必须等待所有的线程(任务)都完成时才能进行下一个步骤。

BlockingQueue

LockSupport




在这里,我汇总一下解决并发的常见问题和对应的解决方案















最简单的,页面的《提交》按钮,在点击后(校验通过后)Disabled

,这样用户就不会重复点击《提交》按钮;









数据库表增加唯一性索引(比如memberId

),这个只能解决一般(为什么一般,继续看)并发插入的问题;












使用乐观锁,在Table

里增加一个version int

字段,这个可以保证更新操作的并发问题;


Select
version, .. from table1 where id=?





Update set
version=version+1 where id=? And version=?




返回的更新条数(count ==1?true:false

)来判断本次更新是否成功









使用悲观锁,一般使用数据库提供的功能(不建议);




… for
update

(悲观锁)







事物提交,锁释放)











有时候,数据库不能加唯一性索引(比如由memberId,status

两个字段,业务要求memberId,status=approved

的数据唯一,其他状态的数据不做限制);



这个时候,需要寻求新的协调中心(之前是数据库光荣的承担这一角色),我们现在使用的Memcached

可以完成这个任务,利用memcached

协议规定add

的原子性,详细请点击这里







你可能感兴趣的:(java多线程)