多线程操作同一个对象时,容易引发线程安全问题。为了解决线程安全问题,Java多线程引入了同步监视器。
同步代码块语法格式如下:
synchronized(obj){ //此处的代码即为同步代码块 }
上面语法格式中synchronized后面括号的obj就是同步监视器,上面代码的含义是:线程开始执行同步代码块之前,必须先获得对同步监视器的锁定。
任何时刻只能有一条线程可以获得对同步监视器的锁定,当同步代码块执行结束后,该线程自然放弃了对同步监视器的锁定。
通常推荐使用可能被并发访问的共享资源当作同步监视器。
同步方法就是用synchronized关键字来修饰某个方法,则该方法称为同步方法。对于同步方法而言,无需显式指定同步监视器,同步方法的同步监视器是this,即当前对象本身。
需要注意的是,synchronized关键字可以修饰代码块,可以修饰方法,但是不能修饰构造器、属性等。
可变类的线程安全是以降低程序运行效率为代价的,为减少线程安全所带来的负面影响,可以使用如下策略:
线程进入同步方法或同步代码块后无法主动释放对同步监视器的锁定,线程会在如下几种情况下释放对同步监视器的锁定:
在下面的情况下,程序不会释放同步监视器的锁定:
原文:http://www.cnblogs.com/amunote/p/4109375.html