synchronized(object)的应用场景以及与synchronized修饰方法的区别
2013-12-28 14:36
411 查看
使用synchronized(object) { 代码块.... } 能对代码块进行加锁,不允许其他线程访问,其的作用原理是:在object内有一个变量,当有线程进入时,判断是否为0,如果为0,表示可进入执行该段代码,同时将该变量设置为1,这时其他线程就不能进入;当执行完这段代码时,再将变量设置为0。
想保证代码块在任务情况下都同步,即代码块在程序的中同一时刻只被一个线程调用,即需要使用synchronized( static object)。
代码例子:
object必须是静态变量,否则不同对象调用该方法时也不能同步。
这种技术可以应用在实现JAVA层的悲观锁,例如在DAO类中希望用悲观锁控制某个方法同步(整个app中每次只允许一个线程同时调用)。
至于在JAVA中实现乐观锁,就可以使用volitile变量,在方法开始时将变量先+1,获取值,然后在方法完成时判断该值是否为方法开始时+1的值,如果不是,则表示有其他线程修改过。
与使用synchronized修饰方法的区别
使用synchronized修饰方法,当一个线程进入这个方法后,这个方法的大门就会暂时关闭(不许其他线程进入)直到这个线程走出这个方法后,该方法的大门才会敞开。当然,这个关闭只是对于该类的当前实例有效,多个实例的对象仍然可以同时执行。
想保证代码块在任务情况下都同步,即代码块在程序的中同一时刻只被一个线程调用,即需要使用synchronized( static object)。
代码例子:
public class TestThread { private static Object lock=new Object(); //必须是静态的。 public void execute(){ synchronized(lock){ for(int i=0;i<100;i++){ System.out.println(i); } } } }
object必须是静态变量,否则不同对象调用该方法时也不能同步。
这种技术可以应用在实现JAVA层的悲观锁,例如在DAO类中希望用悲观锁控制某个方法同步(整个app中每次只允许一个线程同时调用)。
至于在JAVA中实现乐观锁,就可以使用volitile变量,在方法开始时将变量先+1,获取值,然后在方法完成时判断该值是否为方法开始时+1的值,如果不是,则表示有其他线程修改过。
与使用synchronized修饰方法的区别
使用synchronized修饰方法,当一个线程进入这个方法后,这个方法的大门就会暂时关闭(不许其他线程进入)直到这个线程走出这个方法后,该方法的大门才会敞开。当然,这个关闭只是对于该类的当前实例有效,多个实例的对象仍然可以同时执行。
相关文章推荐
- mybatis与hibernate本质的区别以及应用的场景
- 内省与反射区别以及应用场景
- int 和Integer的区别 以及应用场景
- synchronized 修饰在 static方法和非static方法的区别
- synchronized和volatile的使用方法以及区别
- 牛客网Java刷题知识点之同步方法和同步代码块的区别(用synchronized关键字修饰)
- 多线程下synchronized修饰static方法与非static方法的区别
- cookie和session的的区别以及应用场景有哪些?
- 80、Android Support v4、v7、v13的区别以及应用场景
- 多线程下synchronized修饰static方法与非static方法的区别
- 场景二:synchronized修饰方法
- Java语言中synchronized 修饰在 static方法和 非static方法的区别
- Android应用开发SharedPreferences存储数据的使用方法 以及与 getPreferences 、getDefaultSharedPreferences的区别
- 多线程下synchronized修饰static方法与非static方法的区别
- synchronized修饰方法和对象的区别
- synchronized 修饰在 static方法和 非static方法的区别
- .png与.jpg的图片格式的区别?以及它们分别应用场景?
- synchronized 修饰不同方法有何区别?
- interface 与abstract class(接口 与 抽象类)的特点以及区别,以及应用场景
- java多线程下synchronized修饰static方法与非static方法的区别