- volatile :当多个线程进行操作共享数据是, 可以保证内存中的数据可见性
- 相较于 synchronized 是一种轻量级的同步策略
- 注意:
- 1.volatile 不具备 “互斥性”
*2.volatile 不能保证变量的"原子性" - serialNumber=0;
- Hashtable线程安全, 效率非常低, 多线程时,只有一个线程会进入, 进入时 会锁整个表,有时会产生复合操作时 的安全问题
- 复合操作:"若不存在 则添加, 若存在 则删除 "
*3.ConcurrentHashMap 锁 分段机制 :
- concurrentLevel 分为 16个segment ,并行,
- ·ConcurrentHashMap同步容器类 是java5 增加的一个线程安全的哈希表, 对于多线程的操作, 介于 HashMap和
- Hashtable之间, 内部采用 锁分段 机制 替代 Hashtable 的独占锁, 进而提高性能
- · ConcurrentHashMap 、
- ·ConcurrentSkipListMap 、
- ·ConcurrentSkippListSet、
- ·CopyOnWriteArrayList:写入并复制,添加操作多时, 效率低, 因为每次添加时都会进行复制, 并发迭代多时, 选择它
- 和CopyOnWriteArraySet 。
- 当期望许多 线程访问一个给定collection 时, ConcurrentHashMap通常优于同步的HashMap,ConcurrentSkipListMap通常优于同步的TreeMap ,
- 打不过期望的读数和遍历远远大于列表的更新数时, CopyOnWriteArrayLIst优于同步的ArrayList
*CountDownLatch:闭锁 只有其他所有线程的运算全部完成, 当前运算才继续进行
*
` 创建线程的4种方式
*
*
/
/
- 用于解决多线程安全问题的方式:
- synchronized:
- 1.同步代码块
- 2.同步方法
- JDK1.5以后
- 3.同步锁
- 注意: 是一个 显示锁,需要通过lock() 方法上锁, 必须通过unlock()方法进行释放锁
- while (product >= 1) {//为了避免虚假唤醒问题, 应该总是使用在循环中
*Lock
- Condition 控制线程通信
- ·Condition 接口描述了可能 会与锁有关联 的条件变量 , 这些变量在用法上 与使用 Object.wait 访问的隐式监视器类似,
-
但提供了更强大的功能, 单个Lock 可能与多个Conditon 对象管理
- ·在Condition 对象中, 与wait、notify和notifyAl方法对应的分别是await、signal 和signalAll
- ·Condition 实例实质上被绑定在一个锁上, 要为特定lock实例获得Condition 实例, 使用newCondition()方法
*/