我是靠谱客的博主 碧蓝睫毛,最近开发中收集的这篇文章主要介绍synchronized数据类型String的常量池特性(菜鸟玩线程)synchronized数据类型String的常量池特性结论,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
synchronized数据类型String的常量池特性
在JVM虚拟机中有String常量池缓存的功能,将synchronized(String)同步块与String联合起来使用时,注意常量池带来的一些例外。
示例
自定义共享变量类
package com.chapter02.thread2_2_10;
public class Service {
public static void print(String strParam) {
try {
synchronized (strParam) {
while (true) {
System.out.println("CURRENT THREAD NAME = " + Thread.currentThread().getName());
Thread.sleep(1000);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
自定义线程A
package com.chapter02.thread2_2_10;
public class ThreadA extends Thread {
private Service service;
public ThreadA(Service service) {
this.service = service;
}
@Override
public void run() {
super.run();
service.print("AA"); //注意!!!!!
}
}
自定义线程B
package com.chapter02.thread2_2_10;
public class ThreadB extends Thread {
private Service service;
public ThreadB(Service service) {
this.service = service;
}
@Override
public void run() {
super.run();
service.print("AA");//注意!!!!!
}
}
启动类
package com.chapter02.thread2_2_10;
public class Run {
public static void main(String[] args) {
Service service = new Service();
ThreadA threadA = new ThreadA(service);
threadA.setName("A");
threadA.start();
ThreadB threadB = new ThreadB(service);
threadB.setName("B");
threadB.start();
}
}
执行结果
CURRENT THREAD NAME = A
CURRENT THREAD NAME = A
CURRENT THREAD NAME = A
CURRENT THREAD NAME = A
CURRENT THREAD NAME = A
CURRENT THREAD NAME = A
CURRENT THREAD NAME = A
CURRENT THREAD NAME = A
CURRENT THREAD NAME = A
......
结论
如上示例,出现这样的原因就是因为String的两个值都是AA,两个线程持有相同的锁,所以造成线程B无法执行。
这就是String常量池所带来的问题。
因此大部分情况下,同步synchronized代码块都不使用String作为锁对象,而改用其他,如newObject()实例化一个Object对象。
最后
以上就是碧蓝睫毛为你收集整理的synchronized数据类型String的常量池特性(菜鸟玩线程)synchronized数据类型String的常量池特性结论的全部内容,希望文章能够帮你解决synchronized数据类型String的常量池特性(菜鸟玩线程)synchronized数据类型String的常量池特性结论所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复