Java线程的同步
同步能解决的问题是什么呢?
其实线程中的问题有以下几种:
1.竞争条件 当计算的正确性取决于相对时间或者调度器所控制的多线程交叉时,静态条件就会发生。
2.数据竞争 数据竞争是两条或者两条以上的线程并发地访问同一块内存区域,其中至少一条是为了写,而且这些线程没有对那块内存区域的访问。造成的影响是访问的顺序是不确定的。
3.缓存变量 为了提升性能,编译器Java虚拟机以及操作系统会协调在寄存器中或者处理器缓存中缓存变量,而不是依赖主存。
同步临界区的访问同步是 JVM的一个特性,以串行的方式(一次一条线程)访问一段代码块。Java提供synchronized关键字来串行线程对方法和语句块的访问。
使用同步方法同步方法会在方法头部包含synchronized关键字。
使用同步块一个同步块语句把这个待锁住的对象作为前缀头。
语法结构:
synchronized(object){ /* statements*/}
谨防活跃性问题
1.死锁 线程1等待线程2互斥持有的资源,而线程2也在等待线程1互斥持有的资源。两条线程都无法继续执行。
2.活锁 线程X持续重试一个总是失败的操作,以至于无法执行
3.饿死无限延迟volatile和final变量同步的两种属性:互斥和可见性volatile关键字关联,是一种更弱的,仅仅包含可见性的同步形式。
attention:只有可见性导致问题时,才应该使用volative。而且,也只能在属性声明处才能使用这个保留字(如果尝试将局部变量声明成volative,会有错误)
之后会补上关于volative的使用案例
版权声明:本文为博主原创文章,未经博主允许不得转载。https://mp.csdn.net/postedit/80964087