我是靠谱客的博主 虚拟枕头,最近开发中收集的这篇文章主要介绍synchronized("字符串常量"){...},觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

/**
* 在Java中是有常量池缓存的功能的,就是说如果我先声明了一个String str1 = “a”;
* 再声明一个一样的字符串的时候,取值是从原地址去取的,也就是说是同一个对象。这也就导致了在锁字符串对象的时候,可以会取得意料之外的结果(
* 字符串一样会取得相同锁)
*
* @author pengshun.wu
*
*/
public class StringLock {
/*
* 在java 常量池有缓存功能
*/
public void testStringStaticPool() {
String a = "abc";
String b = "abc";
System.out.println(a == b);// true
}
public void method() {
String lockString = "字符串常量";
// String newStringLock = new String("LOCK_STR");
synchronized (lockString) {
// synchronized (newStringLock) {
while (true) {
try {
System.out.println(Thread.currentThread().getName() + "
start");
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + "
end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
StringLock stringLock = new StringLock();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
stringLock.method();
}
}, "t1");
Thread t2 = new Thread(() -> {
stringLock.method();
} , "t2");
// 因为t1和t2都锁住同一个固定字符串,那么t1持有锁之后,t2永远不会执行
// 修改测试方法
// 这里将线程t1和线程t2传进来的参数用new方式创建对象。这样就可以保证不是同一个对象。从而打印的会是异步打印
t1.start();
t2.start();
}
}

最后

以上就是虚拟枕头为你收集整理的synchronized("字符串常量"){...}的全部内容,希望文章能够帮你解决synchronized("字符串常量"){...}所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部