`

关于同步详细

    博客分类:
  • java
阅读更多
在Java中实现同步的四种方法:

1.Volatile(易变的):volatile修饰的成员变量在每次线程访问时,都强迫从共享内存中重读该成员变量的值,且当成员变量发生变化时,强迫线程将变化值回写到共享内存.
1).特点:这样在任何时刻,其他线程总是看到被volatile修饰的成员变量为同一个值(状态)<在java语言规范中指出,为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比,这样多个线程同时与某个对象交互时,就必须要注意到要让线程即使的得到共享成员变量的变化.而volatile关键字就是提示VM,对于此成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互>;
2).使用技巧:在多个线程访问的成员变量上使用volatile关键字进行修饰.当要访问的变量已在synchronized代码块中,或者为常量时,就不必使用volatile修饰了.
3).volatile变量具有synchronized的可见性特性,但是不具备原子特性.这就是说线程能够自动发现volatile变量的最新值.volatile变量可用于提供线程安全,但是只能应用与非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束.
4).使用情况:要使volatile变量提供理想的线程安全,必须同时满足下面两个条件:对变量的写操作不依赖于当前值和该变量没有包含在具有其他变量的不变式中.
2.wait()和notify(),notifyAll():
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll())后本线程才进入对象锁定池准备获得对象锁进入运行状态.
sleep是线程类的方法,导致此线程暂停执行指定时间,把执行机会给其它线程,但是监控状态依然保持,到时候会自动恢复,调用sleep不会释放对象锁.
3.synchronized方法和代码块
4.ThreadLocal(准确意义上是隔离了多个线程中的数据,而不是针对共享数据的操作)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics