线程的生命周期?
线程的创建
- 继承thread类
- 实现runnable
- 匿名内部类
- 带返回值的线程
- 定时器timer
- 线程池的实现
- lambda表达式的实现
- spring实现
锁
任何对象都可以作为锁,那么锁信息又存在对象的的什么地方呢?
存在对象头中
对象头信息
- mark word
- 线程的id
- epoch
- 对象的分代年龄信息
- 是否是偏向锁
- 锁标志位
- class metadata address
- array length
synchronize的锁有以下特征
- 偏向锁(适用于使用一个线程在访问同步代码块)
- 轻量级锁()
- 重量级锁
volatile轻量级锁
volatile称之为轻量级锁,被volatile修饰的变量,在线程之间是可见的。
可见:一个线程修改了这个变量的值,在另外一个线程中能够读到这个修改后的值。
synchronized除了线程之间互斥之外,还有一个非常大的作用,就是保证可见性。
lock指令:
-
- 在多处理器系统上:
- 在当前处理器缓存行的内容写回到系统内存。
- 这个写回到内存的操作会使在其他cpu缓存了该地址的数据失效。
- 硬盘--内存--CPU指令
- 在多处理器系统上:
jdk提供的原子类原理及使用(atomic)
原子更新基本类型
原子更新数组
原子更新抽象类型
原子更新字段
在rt.jar下面
Java.util.concurrent.atomic下面
Lock的使用(jdk5之后juc包中)
AbstractQueuedSynchronized(AQS)(并发的基础)
谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronized(AQS)!
类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...
https://www.cnblogs.com/daydaynobug/p/6752837.html
ReentrantLock(公平锁和非公平锁)
通过构造方法传入不同的参数,来判断是否是公平锁
ReentrantReadWriteLock(读写锁)
锁降级和升级
线程安全性问题简单总结
ThreadLocal
CountDownLatch
CyclicBarrier