千锋西安Java培训怎么样
在Java学习过程中总会遇到的是线程问题,Java学习线程安全问题其实就是并发的正确性问题,一个线程安全的行为,既不需要额外的同步和协调,也不用考虑在runtime中的调度和交替执行,一定能返回预期的结果。
五种线程安全场景
1.不变性
简单纯粹的场景就是不变性,一个不可变的对象一定是线程安全的,如final。
2.线程安全
线程安全是不切实际的,即使是线程安全的Vector容器,也只是在方法中用了synchronized修饰,方法调用时还是需要额外同步,否则,在多线程同时remove,仍然会有Index边界溢出的错误。
3.相对线程安全
一般意义上的线程安全就是相对线程安全,单独操作是线程安全的,但是在特定情况下,还需要在调用时增加额外的同步手段。Java提供的线程安全如Vector、HashTabe、Collections.synchronizedCollection()等,都是相对线程安全。
4.线程兼容
一般意义上的不是线程安全其实是线程兼容,指的是本身并不线程安全,可以在调用时增加同步手段,实现线程安全,常见的ArrayList和HashMap都是线程安全的。
5.线程对立
一些极端情况下,无论采用什么同步措施,都不能实现线程安全,就是线程对立,如Thread的suspend和resume,不能并行调用,很容易出现死锁。
实现线程安全,既与代码的编写有关,也与虚拟机的同步和锁有关,常见的三种线程安全实现方法为:
1.互斥同步
就是共享数据在并行运算中,同一时刻只能一个线程使用,synchronized和ReentrantLock都是互斥同步。
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,实现在同一线程内处理消息队列。
千锋教育:http://www.mobile***/
千锋西安校区:http://xa.mobile***/
西安校区地址:西安市雁塔区高新六路52号立人科技C座西区4楼
培训咨询专线:029-85363390
咨 询 Q Q : 1976279437 联 系 人 :任老师
面授课程:全栈WEB+培训、全链路设计培训、PHP全栈+服务器集群培训、JavaEE+分布式开发培训、大数据+人工智能培训、 Unity游戏开发培训、Python培训、云计算+Python运维培训、全栈软件测试培训、Android培训、iOS培训
千锋西安Java培训怎么样
西安其他教育培训相关信息
12月9日
12月5日
12月4日
11月26日
11月25日
11月22日
11月21日
11月20日
11月19日
11月9日