- 线程安全:当多个线程访问一个对象时,如果不同考虑这些线程在运行时环境下的调度和替换执行,也不需要进行额外的同步,或者在调用方法进行任何其他的协调操作,调用
这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。 - 线程安全的实现方法:
- 互斥同步:synchronized关键字 monitorenter monitorexit字节码指令,在执行monitorenter指令时,首先要尝试获取对象的锁,如果该对象未被锁定或者当前线程已经拥有
了那个对象的锁,把锁的计数器加1,相应的,在执行monitorexit指令时会将锁计数器减1,当计数器为0时,锁就被释放。若果获取对象锁失败,那当前线程就要
阻塞等待,直到对象锁被另外一个线程释放为止。JUC包下ReentrantLock可重入锁,高级项:
1.等待可中断 2.可实现公平锁 3.绑定多个条件 - 非阻塞同步(Non-Blocking Synchronization):CAS指令执行时,当且仅当V符合旧预期值A时,处理器甩新值B更新V的值,否则它就不执行更新。CAS V A B
- 无同步方案:1.可重入代码 2.线程本地存储(Thread Local Storage)
- 锁优化:
- 自旋锁与自适应自旋:互斥同步的时候,对性能影响最大的是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能带来了很大的压力。
同时,共享数据的锁定状态只会持续很短的一段时间,为了这段时间去挂起和恢复线程并不值得。如果物理机器有一个以上的处理器,能让两个或者以上
的线程同时并行执行,可以让后面请求的那个线程“稍等一下”,但是不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放锁。为了让线程等待,
只需要让线程执行一个忙循环(自旋),这就是所谓的自旋锁。自适应自旋:自旋的时间不在固定,而是由前一次在同一个锁上的自旋时间及锁的持有者
状态来决定。 - 锁消除:
- 锁粗化:
- 轻量级锁:
- 偏向锁:
posted on
2019-01-09 19:30
信步踏轻歌
阅读(
98)
评论()
编辑
收藏
举报