【Java】多线程

https://www.cnblogs.com/hustzzl/p/9343797.html
https://www.cnblogs.com/mengheng/p/3491304.html

操作系统

操作系统通过总线锁定处理和缓存一致性保持原子性,缓存一致性性能较高。
CAS通过操作系统保持原子性。

Java

Java多线程同步通过锁的概念实现,有互斥性和可见性。
阻塞是一种状态,不占用CPU时间
wait是挂起,需要等待唤起
sleep是休眠,在指定时间由守护线程唤起
Java使用的是系统线程,操作线程时需要切换从用户态到内核态,影响效率。

syncronized

在JDK6中做了重点优化,对象头中存储锁的信息
偏向锁 优化同一线程持续获取一个锁
轻量级锁 CAS自旋实现,自旋优化
重量级锁 操作系统挂起阻塞mutex

锁消除 肯定不会用到线程同步的就去掉
锁粗化 相近的同步代码块 合并

volite

通过内存一直性保证每个线程获取的数据相同,但不保证原子性

ReentrantLock

ReenTrantLock的实现是一种自旋锁,通过循环调用CAS操作来实现加锁
优势
1.等待可中断lock.lockInterruptibly()来实现这个机制
2.可以为公平锁
3.锁绑定多个条件Condition

ReentrantReadWriteLock

可以更惊喜的控制读写模型,如果使用排他锁,当一个线程读的时候,另一个线程没办法读。
线程进入读锁的前提条件
    没有其他线程的写锁,
    没有写请求或者有写请求,但调用线程和持有锁的线程是同一个

线程进入写锁的前提条件
    没有其他线程的读锁
    没有其他线程的写锁

你可能感兴趣的:(java)