锁定某对象o,如果o的属性发生改变,不影响锁的使用,但是如果o变成另外一个对象,则锁定的对象发生改变,应该避免将锁定对象的引用变成另外一个对象。

public class Demo17 {Object o = new Object();public void test(){synchronized (o) {while (true) {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName());}}}public static void main(String[] args) {Demo17 demo17 = new Demo17();//启动第一个线程new Thread(demo17 :: test, "t1").start(); //JDK1.8新特性try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}//启动第二个线程Thread t2 = new Thread(demo17 :: test, "t2");demo17.o = new Object(); //所对象发生改变,所以t2线程得以执行,如果注释掉这句话,线程t2将永远得不到执行机会t2.start();}
}

不要以字符串常量作为锁定的对象
在下面的例子中,test1和test2其实锁定的是同一个对象
这种情况还会发生比较诡异的现象,比如你用到了一个类库,在该类库中代码锁定了字符串”hello”,
但是你读不到源码,所以你在自己的代码中也锁定了”hello”,这时候就有可能发生非常诡异的死锁阻塞, 因为你的程序和你用的的类库不经意间使用了同一把锁。

public class Demo18 {String s1 = "hello";String s2 = "hello";public void test1(){synchronized (s1) {}}public void test2(){synchronized (s2) {}}
}

Java的高并发编程系列(三)相关推荐

  1. Java JUC高并发编程(三)-CallableJUC辅助类

    目录 一.Callable接口 二.JUC辅助类 1.减少计数CountDownLatch 2.循环栅栏CyclicBarrier 3.信号灯Semaphore 一.Callable接口 Callab ...

  2. 高并发编程系列:NIO、BIO、AIO的区别,及NIO的应用和框架选型

    谈到并发编程就不得不提到NIO,以及相关的Java NIO框架Netty等,并且在很多面试中也经常提到NIO和AIO.同步和异步.阻塞和非阻塞等的区别.我先简短介绍下几个NIO相关的概念,然后再谈NI ...

  3. Java JUC高并发编程(一)

    目录 一.概述 二.Lock接口 三.线程间的通信 解决虚假唤醒问题 Lock通信示例: 四.线程间定制化通信 一.概述 JUC就是java.util.concurrent工具包的简称,这是一个处理线 ...

  4. 高并发编程_高并发编程系列:全面剖析Java并发编程之AQS的核心实现

    在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS. 本篇主要通过对AQS的实现原理.数据模型.资源共享方式.获取锁的过程, ...

  5. java线程高并发编程

    java线程详解及高并发编程庖丁解牛 线程概述: 祖宗: 说起java高并发编程,就不得不提起一位老先生Doug Lea,这位老先生可不得了,看看百度百科对他的评价,一点也不为过: 如果IT的历史,是 ...

  6. 高并发编程_高并发编程系列:7大并发容器详解(附面试题和企业编程指南)...

    不知道从什么时候起,在Java编程中,经常听到Java集合类,同步容器.并发容器,高并发编程成为当下程序员需要去了解掌握的技术之一,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理 ...

  7. Java高并发编程(三):Java内存模型

    1 Java内存模型的基础 在并发编程里,需要处理两个问题: 线程之间如何通信 线程之间如何同步. 通信指的是线程之间以何种机制来交换信息.在命令式编程里中,线程之间的通信机制有两种:共享内存和消息传 ...

  8. blp模型 上读下写_Java高并发编程(三):Java内存模型

    1 Java内存模型的基础 在并发编程里,需要处理两个问题: 线程之间如何通信 线程之间如何同步. 通信指的是线程之间以何种机制来交换信息.在命令式编程里中,线程之间的通信机制有两种:共享内存和消息传 ...

  9. currenthashmap扩容原理_高并发编程系列:深入探讨ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)...

    HashMap.CurrentHashMap 的实现原理基本都是BAT面试必考内容,阿里P8架构师谈:深入探讨HashMap的底层结构.原理.扩容机制深入谈过hashmap的实现原理以及在JDK 1. ...

  10. 高并发编程系列:4大并发工具类的功能、原理、以及应用场景

    通常我们所说的并发包也就是java.util.concurrent,集中了Java并发工具类和并发容器等,今天主要介绍Java并发编程的工具类,我先从Java并发工具包谈起. 01 - 并发工具包涵盖 ...

最新文章

  1. 004_常用词汇句子翻译记录
  2. QTP时间格式的转换(YYYYMMDDHHMMSS)
  3. 域渗透提权之MS14-068
  4. 深度工作,打工人的必备指南!
  5. Excel导入MS SQL SERVER 操作
  6. [html] 写html代码时,如果缺少了结束标签,你如何检测及如何预防?
  7. jQuery事件绑定函数:on()与bind()的差别
  8. mysql 常用函数和关键字
  9. Java并发编程笔记之ArrayBlockingQueue源码分析
  10. HDU 2870 Largest Submatrix
  11. ZZULIOJ 1924: 宣传墙 (dp)
  12. PhoneGap的移动开发框架
  13. 移动通信发展历程见解(从1G到5G发展历程)
  14. 图片放大模糊怎么办?这个方法了解一下
  15. Gamma Correction(伽马校正)
  16. BBKi370孢子手机版java_孢子进化手机游戏
  17. 瓴羊 Quick BI 提供移动端自助分析整体解决方案,Fine BI、Smart BI 何时赶上?
  18. 微信公众号支付java前后端分离开发
  19. [附源码]计算机毕业设计JAVA高校创新创业项目管理系统
  20. VBox虚拟机Linux安装与配置

热门文章

  1. 斗鱼主播后台礼物数据爬取
  2. minist数据集训练与测试
  3. 聚类算法之密度聚类方法
  4. 1024程序员节最新福利之2018最全大数据资料集合
  5. 万字干货,Podman 保姆级中文使用教程
  6. java实现excel、word在线预览
  7. 查看dll或exe文件的依赖项——使用vs自带的dumpbin工具
  8. 系统分析与设计-敏捷迭代方法课后习题答案+学习笔记(答案见最后)
  9. vue json对象转数组_年薪百万之路--第六十七天 Vue入门
  10. 网易云音乐(电脑版)网络连接不上,救命啊!!!