线程实现方式
继承 Thread
实现 Runabled
ExecutorService
Callable Future带返回值的多线程操作
多线程的生命周期
创建、初始化(就绪)、运行、堵塞、退出
Volatile的原理:
对于申明了 Volatile的变量进行写操作的时候,会向处理器发送一条Lock前缀的指令。会把这个变量所在缓存行的数据写回到系统内存。如果有另一个线程来修改,就会效验一下这个lock,不对的时候就重新获取系统内存的值(类似版本锁)。
内存屏障:
内存屏障是被插入两个CPU指令之间的一种指令,用来禁止处理器指令发生重排序(像屏障一样),从而保障有序性的。另外,为了达到屏障的效果,它也会使处理器写入、读取值之前,将写缓冲器的值写入高速缓存,清空无效队列,从而“附带”的保障了可见性.
指令重排(happen-before):
在虚拟机层面,减少内存操作速度慢于cpu运行速度带来的cpu空置期间,虚拟机会安装默认规则将程序顺序打乱执行—即写在后面的代码在时间顺序上可能会先执行,而写在前面的代码会后执行——以尽可能充分地利用CPU
在硬件层面,CPU将接收到的一批指令按照其规则重排序,同样是基于CPU速度比缓存速度快的原因,只是硬件处理的话,每次只能在接收到的有限指令范围内重排序。
Synchronized的原理:
对于申明syncronized的方法或对象操作时,有个监视器monitor,线程访问的时候,会获得这个锁。成功后就操作,如果获得锁失败的放到锁队列里,当上一个线程执行完才可以从队列里继续获得锁。
Synchronized: 无锁->偏向->轻量->重量
(默认是无锁的,当线程来同时调用的时候就转成偏向锁,当多个线程同时竞争时就转为轻量级锁,当大数据量线程来调用且来不及处理的时候就会从轻量级锁切换成重量级锁)
ReentrantLock:可重入锁
lock:可主动释放锁,常用于方法体内。.
公平锁:根据等待时间越长获取锁的几率越大,确保公平
分布式锁:
zookeeper分布式锁:根据zk的树形结构,他有临时节点,持久化节点,当有服务数据进来,默认分配一个id创建临时节点做id存储(id有序),然后根据最小节点的id来执行获取锁,确保有序执行。其中还提供的watch机制监听,当节点不可用时会自动销毁。
redis分布式锁:
setnx:分布式锁
redlock:每个节点独立,根据ttl过期时间并且大于一半节点能获取到锁,表示锁能成功获取,否则释放。主要防止单点故障