首先:推荐使用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)
##如果不同线程监视同一个实例或者不同的实例对象,都会等待.

以上所有结论,本人测试有效。

  1. public class Test {
  2.  
  3. public static void main(String[] args) {
  4. final TestData TestData = new TestData();
  5.  
  6. new Thread() {
  7. public void run() {
  8. testData.insert(Thread.currentThread());
  9. };
  10. }.start();
  11.  
  12. new Thread() {
  13. public void run() {
  14. testData.insert1(Thread.currentThread());
  15. };
  16. }.start();
  17. }
  18. }
  19.  
  20. class TestData {
  21. private ArrayList<Integer> arrayList = new ArrayList<Integer>();
  22.  
  23. public synchronized void insert(Thread thread){
  24. for(int i=0;i<5;i++){
  25. System.out.println(thread.getName()+"在插入数据"+i);
  26. arrayList.add(i);
  27. }
  28. }
  29. public void insert1(Thread thread){
  30. for(int i=0;i<5;i++){
  31. System.out.println(thread.getName()+"在插入数据"+i);
  32. arrayList.add(i);
  33. }
  34. } public void insert2(Thread thread){
  35. for(int i=0;i<5;i++){
  36. System.out.println(thread.getName()+"在插入数据"+i);
  37. arrayList.add(i);
  38. }
  39. }
  40. }

史上最全的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. grep过滤搜索

    cat /proc/2666/maps | busybox grep libumcpart.so

  2. DHCP详解

    概述 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分 ...

  3. The 2014 ACMICPC Asia Regional Xian Online

    [A]签到题 [B]后缀数组 [C]染色,DP(感觉可出) [D]BFS搜索,有点麻烦 [E]博弈论,Nim博弈 [F]BFS状态搜索 [G]概率DP+状态压缩 [H]异或+构造 [I]矩阵快速幂(队 ...

  4. (中等) HDU 5293 Tree chain problem,树链剖分+树形DP。

    Problem Description   Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n.There are ...

  5. Java将List/JavaBean转成Json

    import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.util.List; /**  *  ...

  6. iOS进阶

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:wjh2005链接:https://www.zhihu.com/question/28518265/answer/887505 ...

  7. 《javascript语言精粹》——第6章数组

    [1].数组字面量 var empty=[]; var num=[ 'zero','one','two','three','four','five','six','seven','eight','ni ...

  8. js div截取字符串的长度

    <div style="width:100%;" id="changdu">这个是字符串的长度</div> $("#chang ...

  9. JRPC 轻量级RPC框架

    JRPC是一个轻量级的java RPC框架.它支持服务注册和发现. 目前它开源了,地址为:https://github.com/dinstone/jrpc. Quick Start step 1: g ...

  10. make的参数

    转载自 陈皓<跟我一起写 Makefile> 下面列举了所有GNU make 3.80版的参数定义.其它版本和产商的make大同小异,不过其它产商的make的具体参数还是请参考各自的产品文 ...