15037120869

西安兄弟连IT教育学校

java学习常见问题

来源:西安兄弟连IT教育学校 发布时间:2018/3/7 13:21:51

实现线程安全,既与代码的编写有关,也与虚拟机的同步和锁有关,常见的三种线程安全实现方法为:

1.互斥同步

就是共享数据在并行运算中,同一时刻只能一个线程使用,synchronized和ReentrantLock都是互斥同步。

西安兄弟连IT教育

2.非阻塞同步

其实就是互斥同步的对立面,非阻塞同步相对乐观,认为并行不一定导致共享数据冲突,如果真的出现争用冲突,再做补偿即可(如重试操作,比如compareAndSet(current,next)就是不断尝试赋值,如果current和next的值和预期不一致,就说明数据被修改了,会再次循环尝试),sum.misc.Unsafe类就是非阻塞同步机制(ClassLoader才能直接使用,用户只能通过Java API间接使用,如AtomicInteger),非阻塞同步依赖于硬件指令集的发展和支持。

3.无同步方案

无同步方案不是不管线程安全,而是通过其他方式实现线程安全,不需要同步。

可重入代码

一个方向是通过代码实现无同步,就是可重入代码,可重入代码在执行过程中,随时可以中断,转而执行其他任务(包括递归该代码本身),然后重入继续执行,不会出现错误。

可重入代码也叫纯代码,容易令人想起纯函数(当然,不是同一维度),只要输入相同的数据,就能返回相同的结果。

线程本地存储

另一个方向是通过避免多线程的数据共享实现无同步,就是线程本地存储,也就是把共享数据控制在一个线程内,避免冲突。

大部分使用消费队列的模式都是线程本地存储,这种模式会尽量在一个线程内完成消费,Android中的Handler机制,就是通过ThreadLocal对象(实际上是一个HashMap,key为对象的hashcode,value为对象本身),让handler引用线程的Looper,Looper再依次处理自己MessageQueue中的Message,通过Message的target指向handler,实现在同程内处理消息队列。

领取试听课
每天限量名额,先到先得
温馨提示:为不影响您的学业,来校区前请先电话或QQ咨询,方便我校安排相关的专业老师为您解答
  • 详情请进入 西安兄弟连IT教育学...

关于我们 | 招生信息 | 新闻中心 | 学校动态

版权所有:搜学搜课(www.soxsok.com)