Java线程同步方法

一、同步方法

        除了使用synchronized代码块实现线程的同步外,我们还有同步方法。

使用synchronize修饰的方法就是同步方法,不需要指定监视器(同步方法的监视器就是this,就是该对象本身)。

通过同步方法将某个类变成线程安全的类,其特征如下:

a.该类对象可以被多个线程安全访问。

b.每个线程调用该对象的任意方法后能正确获得结果。

c.每个线程调用该对象的任意方法后,该对象依然保持合理状态。

同样我们使用取钱的例子(例子信息请点击这里大致回看一下)


Java线程同步方法_第1张图片
Account类中使用同步方法


Java线程同步方法_第2张图片
GetMoney取钱操作

注意:synchronized可以修饰方法和代码块,但是不能修饰构造器和属性等。



二、对同步监视器的释放

        在任何线程进入同步代码块和同步方法之前,必须要获得同步监视器的锁定,同时同步监视器的锁定不会显示释放,会在下面的情况下释放:

a.当线程的同步方法、同步代码块执行完后,当前线程立即释放同步监视器。

b.当线程的同步方法、同步代码块在执行的过程等中,遇到了return、break等终止了同步方法、同步代码块的继续执行,当前线程立即释放同步监视器。

c.当线程的同步方法、同步代码块在执行的过程中,遇到了未经处理的Exception、Error,导致了该同步方法、同步代码块异常退出,当前线程立即释放同步监视器。

d.当线程在执行同步方法或同步代码块时,程序执行了同步监视器对象的wait()方法,则当前线程暂停,释放同步监视器。

下面情况下,同步监视器不会释放:

a.线程在执行同步方法、同步代码块时,程序调用了Thread.sleep()、Thread.yield()方法来暂停当前线程的执行,但当前线程不会释放同步监视器。

b.线程在执行同步方法、同步代码块时,其它线程调用了该线程的suspend方法将该线程挂起,该线程不会释放同步监视器。(不过我们应当避免使用suspend或resume)



总结

        因为可变类的线程安全(不可变类的对象总是不变得,所以线程总是安全)是牺牲运行效率而提升的,所以为了减少程序带来的负面影响,线程同步可以采用以下策略:

a.不必对线程安全类的所有方法同步,只对那些竞争资源(共享的资源)进行同步。

b.如果可变类有2种运行状态,单线程和多线程。既提供该类的2种版本,线程不安全版本对应单线程,线程安全版本对应多线程,合理的利用系统资源和程序运行效率。

你可能感兴趣的:(Java线程同步方法)