首先:推荐使用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解释的更多相关文章

  1. 史上最全阿里 Java 面试题总结

    以下为大家整理了阿里巴巴史上最全的 Java 面试题,涉及大量 Java 面试知识点和相关试题. JAVA基础 JAVA中的几种基本数据类型是什么,各自占用多少字节. String类能被继承吗,为什么 ...

  2. Redis分布式锁 (图解-秒懂-史上最全)

    文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...

  3. spring + spring mvc + tomcat 面试题(史上最全)

    文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...

  4. 史上最全的maven pom.xml文件教程详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  5. GitHub上史上最全的Android开源项目分类汇总 (转)

    GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...

  6. 史上最全的 Java 新手问题汇总

    史上最全的 Java 新手问题汇总   Java是目前最流行的编程语言之一——它可以用来编写Windows程序或者是Web应用,移动应用,网络程序,消费电子产品,机顶盒设备,它无处不在. 有超过30亿 ...

  7. 了解iOS消息推送一文就够:史上最全iOS Push技术详解

    本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...

  8. 史上最全的maven的pom.xml文件详解(转载)

    此文出处:史上最全的maven的pom.xml文件详解——阿豪聊干货 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...

  9. 你想找的Python资料这里全都有!没有你找不到!史上最全资料合集

    你想找的Python资料这里全都有!没有你找不到!史上最全资料合集 2017年11月15日 13:48:53 技术小百科 阅读数:1931   GitHub 上有一个 Awesome - XXX 系列 ...

随机推荐

  1. @media max-width 与jquery宽度取值的差异

    最近写了个响应式网站,有些效果通过用jq的$(window).width()来判断屏幕宽度,当屏幕宽度小于1366时一些参数发生变化.@media中也有小于1366的判断条件,但是用起来的时候发现一个 ...

  2. 一个UWSGI的例子

    摘要:uwsgi执行顺序:启动master进程,执行python脚本的公共代码(import同一层).然后生成worker进程,uwsgi.post_fork_hook=init_functions, ...

  3. UIButton 关灯小实验

    // 写在继承于UIViewController的子类中:创建单视图默认有ViewController类 // 实现:点击任何一颗UIButton,它四周的以及它自身都被变成红色,再点击就会变成原来的 ...

  4. Cocos2dx 3.1.1 学习笔记整理(3):逐帧动画

    以下代码是在cocos中使用,plist+png 还有SpriteBatchNode播放动画的代码,备份一下,以防git被墙: bool GameMain::init() { if( !Layer:: ...

  5. (中等) HDU 3335 , DLX+重复覆盖。

    Description As we know,the fzu AekdyCoin is famous of math,especially in the field of number theory. ...

  6. window环境变量

    首先Window中有很多乱七八糟的路径变量之类的,归类下来有几类,主要是为了我们分清楚概念,以免搞的糊涂了. 1. Window系统的环境变量:顾名思义,就是系统级别的变量,或者利用我们编程的角度来讲 ...

  7. iOS中正则表达式的三种使用方式

    1.利用NSPredicate(谓词)匹配 例如匹配有效邮箱: NSString *email = @“nijino_saki@163.com”: NSString *regex = @"[ ...

  8. HUST 1606 Naive

    预处理一下,然后o(1)询问. #include<cstdio> #include<cstring> #include<cmath> #include<str ...

  9. minor gc 和 full gc

    JAVA中关于GC的分析中,需要搞清楚,GC线程在什么时候,对什么东西,做了什么操作. 1-在什么时候 首先需要知道,GC分为minor GC和full GC,JAVA内存分为新生代和老年代,新生代中 ...

  10. STM32驱动TEA5767收音机模块

    Tea5767是飞利浦公司出的一款集成化的收音机芯片,大四的时候机缘巧合遇到了这个芯片,用了一下,写点资料 主要特性 TEA5767HN是一款低功耗立体声收音IC,广泛应用于手机MP3 .MP 4 播 ...