我是靠谱客的博主 碧蓝睫毛,最近开发中收集的这篇文章主要介绍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的常量池特性结论所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部