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对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值