Java多线程学习--同步机制

线程同步机制:用于协调线程间的数据访问及活动的机制,用于保障线程安全以及实现这些线程的共同目标

Java平台提供的同步机制:锁,votatile关键字,final关键字,static关键字以及一些相关API

锁:排他锁(互斥锁),读写锁。又可以分内部锁(synchronized),显示锁(Lock)

锁相关概念:可重入性,锁的争用与调度,锁的粒度

      可重入性:一个线程持有一个锁可以再次申请锁

      锁得争用与调度:锁作为资源,调度策略可以分为公平策略和非公平策略

      锁的粒度:一个锁保护共享数据的大小。相对

锁的使用场景:

  1 check-then-act操作:一个线程读取共享数据并在此基础上决定下一个操作时什么

  2 read-modify-writer操作:一个线程读取共享数据并在基础上更新数据;

  3 多个线程对多个共享变量进行更新。

内存屏障:被插入到两个指令之间进行使用,其作用是禁止编译器,处理器重排序从而保障有序性;

volatile关键字:被称为轻量级锁,保障可见性和有序性。但是没有锁的排他性。其次volatile不会引起上下文切换。被冠以“轻量级锁”的原因

volatile典型使用场景:

  1 使用volatile变量作为状态标志

  2 votatile保障可见性

  3 使用volatile变量替代锁

问:内部锁和显示锁的区别有哪些?

答:1 内部锁作为关键字无法发挥java的特性,显示锁可以再一个方法中申请,在另一个方法中释放

  2 内部锁使用简单,并且不会导致锁泄露

  3 内部锁如果线程持有不释放则其他线程任务无法进站,显示锁可以tryLock(尝试获取)

  4 内部锁调度策略只有非公平锁,显示锁有公平策略和非公平策略两种

问:锁的开销和可能导致的问题有哪些?

答:锁的开销包括申请和释放所产生的开销,以及锁可能导致的上下文切换的开销,这些开销主要是处理器的时间。此外锁的不正确使用可能导致一些活性故障如:锁泄露,死锁,锁死,活锁等线程故障

问 :锁如何保障线程安全的?

答:锁通过互斥保障原子性;可见性保障是通过写线程冲刷处理器缓存和读线程刷新处理器缓存这两个动作实现的,锁通过内存屏障来实现这个操作;有序性通过原子性和可见性可以看出当写线程更新某一个共享变量,读线程可读取最新值,则写线程在执行临界区的代码时看起来像是有序的

问:锁对可见性,原子性,有序性的保障条件有哪些?

答:1 这些线程在访问同一个共享数据时候必须使用同一个锁

  2 这些线程中的任意一个线程,即使仅仅只是读取共享数据,也需要在读取的时候持有相应的锁

问:volatile可以保障可见性,有序性,原子性吗?

答:可以保障可见性,有序性。但是在原子性方面只有保障对修饰的变量读写操作本身的原子性,如果要保障volatile变量的复制操作的原子性,那么赋值操作不能涉及任何共享变量的访问(包括自身)

 

posted on 2018-04-15 19:01  小成成2016  阅读(125)  评论(1)    收藏  举报

导航