线程安全与同步总结

线程安全

对共享数据(shared)和可变状态(mutable)的访问,共享是针对同时访问而言,可变是生命周期角度而言。

解决线程安全的常用方法

1、java.util.concurrnet串行机制
如使用 AtomicLong 代替使用Long;
CopyOnWriteArrayList 代替 List;
并发容器:
CouncurrentHashMap : 分段锁(Lock Striping),并发访问下实现更高吞吐量;
HashTable 、synchronizedMap
阻塞队列:
BlockingQueue
工具类: 信号量(Semaphore)、栅栏(Barrier)、
闭锁(Latch):确保某些线程等其他线程弯成后再执行

2、内置锁
java体统内置锁机制,如synchronized,其有可重入性,即某个线程试图获得自己的锁时,则会成功。
常用加锁做法是,将所有可变状态封装在对象内部。
3、volatile
变量不会被缓存在寄存器或其他cup不可见的地方,其不是加锁,所以不会阻塞,因此轻量级。
3、LocalThread
提供set、get接口,仅在线程内部访问
原理:为每个使用该变量的线程都创建一个副本
4、final
语义:当构造函数结束时,final类型的值保证其他线程访问该对象时,值可见。
属于安全发布的一种方式(即一个线程在创建该对象时,其他线程可引用到该对象最新值),通俗讲,若成员变量时final类型,一旦对象对其他线程可见,则final成员也必须赋值了。
eg:如果存在并发问题,需要同步机制访问或使用concurrentHashmap,而final修饰不可变对象,可并发访问,而不用使用同步机制。
5、显示锁:Lock
6、创建线程
Callable(接口):带返回结果,从线程的生命周期角度考虑,提供任务执行状态和取消功能。
Runnable/Thread:只能前进,不能后退的线程。
7:池化
提供线程的抽象,基于生产者–消费者模式

你可能感兴趣的:(笔记,java)