在Java中是有常量池缓存的功能的,就是说如果我先声明了一个String str1 = “a”; 再声明一个一样的字符串的时候,取值是从原地址去取的,也就是说是同一个对象。这也就导致了在锁字符串对象的时候,可以会取得意料之外的结果(字符串一样会取得相同锁)。

package com.bjsxt.base.sync006;
/**
* synchronized代码块对字符串的锁,注意String常量池的缓存功能,
* @author alienware
*
*/
public class StringLock {

public void method() {
//new String("字符串常量")
synchronized ("字符串常量") {
try {
while(true){
System.out.println("当前线程 : " + Thread.currentThread().getName() + "开始");
Thread.sleep(1000);
System.out.println("当前线程 : " + Thread.currentThread().getName() + "结束");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) {
final StringLock stringLock = new StringLock();
Thread t1 = new Thread(new Runnable() {

public void run() {
stringLock.method();
}
},"t1");
Thread t2 = new Thread(new Runnable() {

public void run() {
stringLock.method();
}
},"t2");

t1.start();
t2.start();
}
}

运行结果:

当前线程 : t1开始
当前线程 : t1结束
当前线程 : t1开始
当前线程 : t1结束
当前线程 : t1开始

。。。。。。。。

改为synchronized (new String("字符串常量"))之后,运行结果:

当前线程 : t1开始
当前线程 : t2开始
当前线程 : t2结束
当前线程 : t1结束
当前线程 : t1开始
当前线程 : t2开始

。。。。。。。。

转载于:https://www.cnblogs.com/tsdblogs/p/8761030.html

synchronized(九)相关推荐

  1. Java多线程学习二十九:AtomicInteger(原子类) 和 synchronized 的异同点?

    原子类和 synchronized 关键字都可以用来保证线程安全,在本课时中,我们首先分别用原子类和 synchronized 关键字来解决一个经典的线程安全问题,给出具体的代码对比,然后再分析它们背 ...

  2. java static 可见性_Java多线程 synchronized与可见性的关系以及可见性问题总结

    作者:七里香的编程之路 出自:OSCHINA 原文:my.oschina.net/u/4098550/blog/4548274 能保证可见性的措施 除了volatile 可以让变量保证可见性外.hap ...

  3. 备战金九银十,阿里P8师兄指导完整攻略(附:学习资料+面试宝典+项目实战笔记)

    前言 还剩下两个月就到了金九银十,一般来说,秋招的含金量明显是高于春招的. 那么如何准备即将到来的面试热潮呢?运筹帷幄之后,决胜千里之外! 坚决不打毫无准备的仗是小编的原则:不论是笔试还是面试都是有章 ...

  4. dubbo源码解析(九)远程通信——Transport层

    远程通讯--Transport层 目标:介绍Transport层的相关设计和逻辑.介绍dubbo-remoting-api中的transport包内的源码解析. 前言 先预警一下,该文篇幅会很长,做好 ...

  5. springMVC九大组件及一次请求流程

    一.九大组件 HandlerMapping(处理器映射器) HandlerMapping 是⽤来查找Handler的,也就是处理器,具体的表现形式可以是类,也可以是⽅法.⽐如,标注了@RequestM ...

  6. Java多线程系列(六):深入详解Synchronized同步锁的底层实现

    谈到多线程就不得不谈到Synchronized,很多同学只会使用,缺不是很明白整个Synchronized的底层实现原理,这也是面试经常被问到的环节,比如: synchronized的底层实现原理 s ...

  7. Android 系统(191)---ODM 开发用户常见需求文档(九)

    Android 系统(191)---ODM 开发用户常见需求文档(九) 阅读数:1122 一:去除摄像头的假对焦框 (vendor/) (mediatek/proprietary/packages/a ...

  8. Android开发笔记(八十九)单例模式

    基本概念 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,从而方便对实例个数的控制并节约系统资源. 单例模式有三个特点: 1.某个类只能有一个实例: 2.它要自行创建这个实例: 3.它只有 ...

  9. 由浅入深,逐步了解 Java 并发编程中的 Synchronized!

    作者 | sowhat1412  责编 | 张文 头图 | CSDN 下载自视觉中国 来源 | sowhat1412(ID:sowhat9094) synchronized 作用 synchroniz ...

最新文章

  1. 轻量级语义分割网络:ENet
  2. poj-1384 Piggy-Bank
  3. mysql的tcp链接过程_tcp建立连接和断开连接过程
  4. 2015-12-03 AD中用户属性Lastlogon与LastlogonTimeStamp的区别
  5. Diango博客--13.将“视图函数”类转化为“类视图”
  6. 今晚鼓捣的audio.js一些小经验
  7. box2D斜面摩擦力和sprite朝向的兼顾取舍
  8. C# 最小化到系统托盘的实现(一)
  9. JasperReport报表开发(一)--原理介绍
  10. bp神经网络的主要功能,BP神经网络的实现包括
  11. Wap模拟器,pc端浏览器,手机wap网站,web项目
  12. 滨州学院CSDN高校俱乐部 策划书
  13. 【BZOJ5336】【TJOI2018】party
  14. css透明度兼容问题opacity
  15. 【泰国留学那些事】水灯节--泰国人极致浪漫的艺术画像
  16. IBM发表未来5年5项科技预测 3D全息手机或现世
  17. spreadsheetControl
  18. 数据结构——单链表 | 完善单链表
  19. vue学习入门——Idea中安装vue插件
  20. java开发用allman风格_缩进风格

热门文章

  1. Spring Cloud Alibaba —— Sentinel 入门
  2. Hashtable、HashMap、TreeMap总结
  3. 选择座位html,影厅座位预览效果(css3)_html/css_WEB-ITnose
  4. 计算机网络聚合怎么设置,交换机的端口聚合如何配置
  5. Apprentissage du français partie 3
  6. mysql查看用户名_Mysql创建数据表的方法介绍(附示例)
  7. python 函数 过程_python学习之函数(三)--函数与过程
  8. djano 字段不重复_Java 14 发布了,不使用quot;classquot;也能定义类了?还顺手要干掉Lombok!...
  9. ❤️六W字《计算机基础知识》(五)(建议收藏)❤️
  10. c语言文件读写_学生信息管理系统(C语言\单向链表\文件读写)