java的synchronized的使用场景简介以及在不同场景下的差异
2016-05-27 10:15
399 查看
例子:
对象MyTag包含两个方法如下:
1,methodF 是用synchronized修饰的
2,methodS 没有用synchronized修饰
声明一个对象objectMyTag
线程ThreadA、线程ThreadB 的构造函数的参数都是MyTag对象
场景一:
ThreadA的run方法调用methodF、ThreadB的run方法调用methodS
执行结果:
ThreadA获得objectMyTag 对象的锁,执行methodF。但是ThreadB仍然可以异步调用objectMyTag 对象 的方法methodS
场景二:
假如修改methodS的为synchronized修饰
ThreadA的run方法调用methodF、ThreadB的run方法调用methodS
执行结果:
ThreadA获得objectMyTag 对象的锁,执行methodF。但是ThreadB只能同步调用objectMyTag 对象 的方法methodS,就是说ThreadB要等待获取objectMyTag的对象锁
总结:
1,当对一个对象的方法加上synchronized修饰的时候,就相当于给定义的对象加上了一个对象锁,但是这个锁也就是当其他线程调用synchronized修饰的方法才起作用,对于没有synchronized修饰的方法,其他线程还是可以异步调用的。
2,当这个对象的多个方法都存在用synchronized修饰的时候,那么多个调用这些synchronized修饰的方法的线程就需要排队等待着个对象的锁了,这个时候这些synchronized修饰的方法的执行都是排队执行的(谁先获得对象锁,谁先执行的)
对象MyTag包含两个方法如下:
1,methodF 是用synchronized修饰的
2,methodS 没有用synchronized修饰
声明一个对象objectMyTag
线程ThreadA、线程ThreadB 的构造函数的参数都是MyTag对象
场景一:
ThreadA的run方法调用methodF、ThreadB的run方法调用methodS
执行结果:
ThreadA获得objectMyTag 对象的锁,执行methodF。但是ThreadB仍然可以异步调用objectMyTag 对象 的方法methodS
场景二:
假如修改methodS的为synchronized修饰
ThreadA的run方法调用methodF、ThreadB的run方法调用methodS
执行结果:
ThreadA获得objectMyTag 对象的锁,执行methodF。但是ThreadB只能同步调用objectMyTag 对象 的方法methodS,就是说ThreadB要等待获取objectMyTag的对象锁
总结:
1,当对一个对象的方法加上synchronized修饰的时候,就相当于给定义的对象加上了一个对象锁,但是这个锁也就是当其他线程调用synchronized修饰的方法才起作用,对于没有synchronized修饰的方法,其他线程还是可以异步调用的。
2,当这个对象的多个方法都存在用synchronized修饰的时候,那么多个调用这些synchronized修饰的方法的线程就需要排队等待着个对象的锁了,这个时候这些synchronized修饰的方法的执行都是排队执行的(谁先获得对象锁,谁先执行的)
相关文章推荐
- java:动态代理
- Spring bean 通过实现 InitializingBean ,DisposableBean 接口实现初始化方法和销毁前操作
- springmvc4 相关注解的详细讲解
- 代理类的实现
- Spring内部bean实例
- ERROR executor.Executor: Exception in task 0.0 in stage 0.0 (TID 0) java.lang.IllegalArgumentExcepti
- springmvc4 相关注解的详细讲解
- Java中的String和Date、Timestamp之间的转换+long类型的陷阱
- java.util.Properties.getProperty()方法实例
- Spring bean加载多个配置文件
- SpringMVC学习--springmvc和mybatis整合
- Java消除list中重复项
- mybatis系列-16-spring和mybatis整合
- Java Web之JSP技术
- 如何注入值到Spring bean属性
- SpringMVC学习--springmvc和mybatis整合
- java 根据字符串得到该字符串首写的拼音码列表
- java的动态代理机制
- Failed to load JavaHL Library解决方法
- 禁止eclipse对压缩过的JS提示报错