Java线程同步小陷阱,你掉进去过吗?
来源:互联网 发布:沪昆高铁 问题 知乎 编辑:程序博客网 时间:2024/05/04 21:20
【问题】
当一个线程使用String常量作为信号量,来实现同步会如何?你有用过吗?
package test.mult;/** * @ClassName: Test * @author whwang * @date 2012-1-10 下午02:28:39 * */public class Test { private String mutex = "mutex"; public void f(String flag) {System.out.println(flag + ", entry mehtod f");synchronized (mutex) { System.err.println(flag + ", invoke method f...."); try {Thread.sleep(10 * 1000); } catch (InterruptedException e) {e.printStackTrace(); }} } public static void main(String[] args) {// t1Test t1 = new Test();MyThread thread1 = new MyThread();MyThread thread2 = new MyThread();thread1.test = t1;thread2.test = t1;// t2Test t2 = new Test();MyThread thread3 = new MyThread();MyThread thread4 = new MyThread();thread3.test = t2;thread4.test = t2;thread1.start();thread2.start();thread3.start();thread4.start(); }}class MyThread extends Thread { Test test; @Override public void run() {while (true) { this.test.f(this.toString());} }}上面这段代码,本来应该是要实现线程thread1和thread2同步,线程thread3和thread4同步的,但结果呢?
却是使得线程thread1、thread2、thread3、thread4同步了,囧。
导致这结果的理由很简单:由于常量池的原因,所有值为“mutex”的字符串常量,都指向了同一个对象。
这让我想起了原来看过的另一篇关于StringBuilder的文章:
int value = 100;StringBuilder sb = new StringBuilder(value);作者的本意是,构造一个StringBuilder对象,初始值为“100”,但实际却是开辟了一个长度为value的char数组,如果这个value再大点。。。。。
- Java线程同步小陷阱,你掉进去过吗?
- Java线程同步小陷阱,你掉进去过吗?
- Java线程同步小陷阱,你掉进去过吗?
- 这些减肥陷阱,你掉进去了吗?
- C++ string中的几个小陷阱,你掉进过吗?
- C++ string中的几个小陷阱,你掉进过吗?
- C++ string中的几个小陷阱,你掉进过吗?
- [坑死老子了]C++ string中的几个小陷阱,你掉进过吗?
- 常见的javascript 陷阱 你遇到过吗
- 自媒体淘客的四个坑你掉进去过没
- java线程同步的小例子
- Java标识符小陷阱
- Numpy 隐含的四大陷阱,千万别掉进去了!
- Java的一个小陷阱
- Java 小例子:线程同步例子:三个学生取水
- java 线程同步 小程序 内部类实现(咋个办呢 zgbn)
- 你不知道的Java学习笔记24-- 线程同步
- 你用过java.text.DecimalFormat吗?
- 【ACE】Linux 和 Windows 下ACE的编译.
- html页面实现IE的前进、后退功能
- android之3D Gallery
- Mini2440的ADC linux驱动 之 定格式
- 恶心的广告 兼职打字
- Java线程同步小陷阱,你掉进去过吗?
- 世界末年也要把这本书再好好看看——读书计划之2012
- 从裸奔到RTX的使用提示
- 命令行执行
- 简易任务调度实现--可用于windows服务/asp.net网站执行后台计算
- PS里颜色替换
- 通信录操作
- ExpandableListView 功能界面布局探究之一 ( 更换ExpandableListView右边的箭头(小图标))
- passw、shadow、group文件详解