史上最全的synchronized解释
首先:推荐使用synchronized(obj)这种方法体的使用方式,一个类里面建议尽量使用单一的同步方法,多种方法混用,维护成本太大。
其次:关于java5.0新增的ReenTrantLock方法:《Javaconcurrency in practice》里说的很清楚:只有当内置锁不能满足的情况下采考虑使用LOCK,如果忘记UNLOCK将是一颗定时炸弹。符合 “可定时的,可轮询的,可中断的”情况下建议使用LOCK。
最后:鉴于本人10年左右的编程经验,建议使用synchronized,同时建议使用同步成员变量的形式,可以作为项目规范实施。
概念总结:
synchronized锁的是对象(除非.Class)
如果是多个对象根本不存在竞争,则无需synchronized。如果存在synchronized的方法和普通方法并存,则根本没有等待,无需考虑锁,但是要考虑共享资源的问题,这是并发的问题,和锁已经没有关系了,测试例子说明了这个问题。
synchronized(.Class)
唯一存在可能控制多个对象竞争等待的问题,不建议使用。
同步方法
synchronized A()
synchronized A()
##如果不同线程监视同一个实例对象,就会等待
synchronized A()
synchronized B()
##如果不同线程监视同一个实例对象,就会等待
synchronized A()
B()
##线程各自获取monitor,不会有等待.
同步this
synchronized(this)
synchronized A()
##如果不同线程监视同一个实例对象,就会等待
synchronized(this)
synchronized(this)
##如果不同线程监视同一个实例对象,就会等待
synchronized(this)
B()
##线程各自获取monitor,不会有等待.
同步成员变量
synchronized(obj1)
synchronized(obj1)
##如果不同线程监视同一个实例对象,就会等待
synchronized(obj2)
synchronized(obj1)
##线程各自获取monitor,不会有等待.
synchronized(obj1)
synchronized A()
##线程各自获取monitor,不会有等待.
synchronized(obj1)
synchronized(this)
synchronized(class)
B()
##线程各自获取monitor,不会有等待.
同步Class
synchronized(class)
synchronized(this)
##线程各自获取monitor,不会有等待.
synchronized(class)
synchronized(obj1)
##线程各自获取monitor,不会有等待.
synchronized(class)
synchronized A ()
##线程各自获取monitor,不会有等待.
synchronized(class)
synchronized(class)
##如果不同线程监视同一个实例或者不同的实例对象,都会等待.
以上所有结论,本人测试有效。
- public class Test {
- public static void main(String[] args) {
- final TestData TestData = new TestData();
- new Thread() {
- public void run() {
- testData.insert(Thread.currentThread());
- };
- }.start();
- new Thread() {
- public void run() {
- testData.insert1(Thread.currentThread());
- };
- }.start();
- }
- }
- class TestData {
- private ArrayList<Integer> arrayList = new ArrayList<Integer>();
- public synchronized void insert(Thread thread){
- for(int i=0;i<5;i++){
- System.out.println(thread.getName()+"在插入数据"+i);
- arrayList.add(i);
- }
- }
- public void insert1(Thread thread){
- for(int i=0;i<5;i++){
- System.out.println(thread.getName()+"在插入数据"+i);
- arrayList.add(i);
- }
- } public void insert2(Thread thread){
- for(int i=0;i<5;i++){
- System.out.println(thread.getName()+"在插入数据"+i);
- arrayList.add(i);
- }
- }
- }
史上最全的synchronized解释的更多相关文章
- 史上最全阿里 Java 面试题总结
以下为大家整理了阿里巴巴史上最全的 Java 面试题,涉及大量 Java 面试知识点和相关试题. JAVA基础 JAVA中的几种基本数据类型是什么,各自占用多少字节. String类能被继承吗,为什么 ...
- Redis分布式锁 (图解-秒懂-史上最全)
文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...
- spring + spring mvc + tomcat 面试题(史上最全)
文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...
- 史上最全的maven pom.xml文件教程详解
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- GitHub上史上最全的Android开源项目分类汇总 (转)
GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...
- 史上最全的 Java 新手问题汇总
史上最全的 Java 新手问题汇总 Java是目前最流行的编程语言之一——它可以用来编写Windows程序或者是Web应用,移动应用,网络程序,消费电子产品,机顶盒设备,它无处不在. 有超过30亿 ...
- 了解iOS消息推送一文就够:史上最全iOS Push技术详解
本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...
- 史上最全的maven的pom.xml文件详解(转载)
此文出处:史上最全的maven的pom.xml文件详解——阿豪聊干货 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...
- 你想找的Python资料这里全都有!没有你找不到!史上最全资料合集
你想找的Python资料这里全都有!没有你找不到!史上最全资料合集 2017年11月15日 13:48:53 技术小百科 阅读数:1931 GitHub 上有一个 Awesome - XXX 系列 ...
随机推荐
- grep过滤搜索
cat /proc/2666/maps | busybox grep libumcpart.so
- DHCP详解
概述 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分 ...
- The 2014 ACMICPC Asia Regional Xian Online
[A]签到题 [B]后缀数组 [C]染色,DP(感觉可出) [D]BFS搜索,有点麻烦 [E]博弈论,Nim博弈 [F]BFS状态搜索 [G]概率DP+状态压缩 [H]异或+构造 [I]矩阵快速幂(队 ...
- (中等) HDU 5293 Tree chain problem,树链剖分+树形DP。
Problem Description Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n.There are ...
- Java将List/JavaBean转成Json
import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.util.List; /** * ...
- iOS进阶
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:wjh2005链接:https://www.zhihu.com/question/28518265/answer/887505 ...
- 《javascript语言精粹》——第6章数组
[1].数组字面量 var empty=[]; var num=[ 'zero','one','two','three','four','five','six','seven','eight','ni ...
- js div截取字符串的长度
<div style="width:100%;" id="changdu">这个是字符串的长度</div> $("#chang ...
- JRPC 轻量级RPC框架
JRPC是一个轻量级的java RPC框架.它支持服务注册和发现. 目前它开源了,地址为:https://github.com/dinstone/jrpc. Quick Start step 1: g ...
- make的参数
转载自 陈皓<跟我一起写 Makefile> 下面列举了所有GNU make 3.80版的参数定义.其它版本和产商的make大同小异,不过其它产商的make的具体参数还是请参考各自的产品文 ...