java多线程学习总结之四:线程的同步

线程的同步是保证多线程安全访问竞争资源的一种手段。对于同步,在具体的Java代码中须要完成一下两个操做:把竞争访问的资源标识为private;同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。 java

线程退出同步方法时将释放掉方法所属对象的锁,但还应该注意的是,同步方法中还能够使用特定的方法对线程进行调度。这些方法来自于java.lang.Object类。 安全

void notify()    
                    唤醒在此对象监视器上等待的单个线程。    
void notifyAll()    
                    唤醒在此对象监视器上等待的全部线程。    
void wait()    
                    致使当前的线程等待,直到其余线程调用此对象的 notify() 方法或 notifyAll() 方法。    
void wait(long timeout)    
                    致使当前的线程等待,直到其余线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。    
void wait(long timeout, int nanos)    
                    致使当前的线程等待,直到其余线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其余某个线程中断当前线程,或者已超过某个实际时间量。

对于同步,除了同步方法外,还能够使用同步代码块,有时候同步代码块会带来比同步方法更好的效果。追其同步的根本的目的,是控制竞争资源的正确的访问,所以只要在访问竞争资源的时候保证同一时刻只能一个线程访问便可,所以Java引入了同步代码快的策略,以提升性能。 多线程

注意: 性能

在使用synchronized关键字时候,应该尽量避免在synchronized方法或synchronized块中使用sleep或者yield方法,由于synchronized程序块占有着对象锁,你休息那么其余的线程只能一边等着你醒来执行完了才能执行。不但严重影响效率,也不合逻辑。
一样,在同步程序块内调用yeild方法让出CPU资源也没有意义,由于你占用着锁,其余互斥线程仍是没法访问同步程序块。固然与同步程序块无关的线程能够得到更多的执行时间。
相关文章
相关标签/搜索