我是靠谱客的博主 碧蓝河马,最近开发中收集的这篇文章主要介绍【java并发系列】为什么尽量不要使用 synchronized(String a)演示案例返回结果总结,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
大家好,我是walker
一个从文科自学转行的程序员~
爱好编程,偶尔写写编程文章和生活
欢迎关注公众号【I am Walker】,回复“电子书”,就可以获得200多本编程相关电子书哈~
我的gitee:https://gitee.com/shen-chuhao/walker.git 里面很多技术案例!
尽量不要使用 synchronized(String a) 因为JVM中,字符串常量池具有缓存功能!,就会导致你会加锁在同一个对象。
演示案例
package synchronizedTest;
/**
* author:walker
* time: 2022/3/21
* description:
String常量池问题
*/
public class StringProblem {
//使用字符串定义变量r1和r2,这样会使r1和r2指向常量池的同个数据,使得r1和r2实际上是一个对象
private static String r1="a";
private static String r2="a";
public static void main(String[] args) {
//1、定义线程A
new Thread(()->{
//获得对象r1
synchronized (r1){
System.out.println("获取资源1");
try {
//这里的目的主要是让线程A长期持有锁,这样线程B没法获取到锁,一直阻塞
while (true){
System.out.println(Thread.currentThread().getName()+"执行中");
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"线程A").start();
//2、定义线程B
new Thread(()->{
synchronized (r2){
System.out.println("获取资源2");
}
},"线程B").start();
}
}
返回结果
获取资源1
线程A执行中
线程A执行中
线程A执行中
线程A执行中
线程A执行中
线程A执行中
总结
由此可知,synchronized一般不要使用String对象作为锁,如果使用,一定要做好对象区分,否则就会导致对象一致的问题
最后
以上就是碧蓝河马为你收集整理的【java并发系列】为什么尽量不要使用 synchronized(String a)演示案例返回结果总结的全部内容,希望文章能够帮你解决【java并发系列】为什么尽量不要使用 synchronized(String a)演示案例返回结果总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复