博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程之synchronized锁字符串对象的一个易错点
阅读量:4292 次
发布时间:2019-05-27

本文共 599 字,大约阅读时间需要 1 分钟。

前段时间讲了synchronized锁方法,锁this对象,锁非this对象。具体可以看往期的文章,今天我们来看下锁非this对象(锁String对象)的一个注意点。在Java中是有常量池缓存的功能的,就是说如果我先声明了一个String str1 = “a”; 再声明一个一样的字符串的时候,取值是从原地址去取的,也就是说是同一个对象。这也就导致了在锁字符串对象的时候,可以会取得意料之外的结果(字符串一样会取得相同锁),下面看一个例子介绍。

多线程之synchronized锁字符串对象的一个易错点

测试方法

这里synchronized锁的是字符串对象,如果不是同一个对象,那么两个线程就可以异步进来。下面看下线程和测试结果。

多线程之synchronized锁字符串对象的一个易错点

线程A

这里建两个线程,线程B和线程A一样就不贴出来了,都是将“xc”字符串传给上面的测试方法。下面看下测试结果。

多线程之synchronized锁字符串对象的一个易错点

测试结果

从结果可以就看到,线程B并没有进来,也就说明两个线程持有的是同一个锁,即字符串对象是同一个。这就是String常量池会带来的问题。所以在大多数情况下,同步代码块synchronized代码块不使用String作为锁对象,而采用其他。

多线程之synchronized锁字符串对象的一个易错点

修改测试方法

这里将线程A和线程B传进来的参数用new方式创建对象。这样就可以保证不是同一个对象。从而打印的会是异步打印。

所以大家在使用字符串作为同步锁对象的时候要注意~~

谢谢大家的收看,喜欢的关注一波~~~

转载地址:http://wmwws.baihongyu.com/

你可能感兴趣的文章
Maven:mirror和repository 区别
查看>>
微服务网关 Spring Cloud Gateway
查看>>
SpringCloud Feign的使用方式(一)
查看>>
SpringCloud Feign的使用方式(二)
查看>>
关于Vue-cli+ElementUI项目 打包时排除Vue和ElementUI
查看>>
Vue 路由懒加载根据根路由合并chunk块
查看>>
vue中 不更新视图 四种解决方法
查看>>
MySQL 查看执行计划
查看>>
OpenGL ES 3.0(四)图元、VBO、VAO
查看>>
OpenGL ES 3.0(五)纹理
查看>>
OpenGL ES 3.0(八)实现带水印的相机预览功能
查看>>
OpenGL ES 3.0(九)实现美颜相机功能
查看>>
FFmpeg 的介绍与使用
查看>>
Android 虚拟机简单介绍——ART、Dalvik、启动流程分析
查看>>
原理性地理解 Java 泛型中的 extends、super 及 Kotlin 的协变、逆变
查看>>
FFmpeg 是如何实现多态的?
查看>>
FFmpeg 源码分析 - avcodec_send_packet 和 avcodec_receive_frame
查看>>
FFmpeg 新旧版本编码 API 的区别
查看>>
RecyclerView 源码深入解析——绘制流程、缓存机制、动画等
查看>>
Android 面试题整理总结(一)Java 基础
查看>>