首先:推荐使用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. Android学习笔记之Service

    与服务通信 用bindservice 而startservice并无通信条件. service 为android为系统服务,所以程序员无法new出来,只能建立服务,共其他组件使用. package c ...

  2. Java IO整理

    参考博客:http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html Java   IO体系结构 1.要弄清楚其体系结构,先明白 ...

  3. a标签的target的四个值

    特殊的目标 有 4 个保留的目标名称用作特殊的文档重定向操作: _blank 浏览器总在一个新打开.未命名的窗口中载入目标文档. _self 这个目标的值对所有没有指定目标的 <a> 标签 ...

  4. [转] Eclipse中已安装的插件如何卸载

    转自 : http://blog.csdn.net/macong01/article/details/7631105 最近在Eclipse中安装了一个插件,导致Eclipse使用的时候有些问题,就找了 ...

  5. Oracle教程-安装、结构(一)

    本文安装的是Oracle中的11G版本 一. 将文件win32_11gR2_database_1of2.zip和win32_11gR2_database_2of2.zip解压. 注意:这两个文件解压到 ...

  6. (中等) HDU 3416 Marriage Match IV,SPFA+SAP。

    Description Do not sincere non-interference. Like that show, now starvae also take part in a show, b ...

  7. spring调用mongodb

    1.环境 Jdk:1.6.0_10-rc2 Spring3.1.2  下载 依赖jar文件: 2.相关配置 ①.spring配置文件 <?xml version="1.0" ...

  8. Docker 命令(二)

    Docker 入门 启动docker systemctl start docker 帮助命令 docker --help docker [Commands] --help   例:docker run ...

  9. 你会做Web上的用户登录功能吗?

    Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能.下面的文章告诉大家这个功能可能并没有你所想像的那么简单,这是一个关 ...

  10. cocos2dx3.5 HTC One X 某些UI白屏或使用ClippingNode造成部分手机白屏

    public Cocos2dxGLSurfaceView onCreateView() { Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSu ...