zoukankan      html  css  js  c++  java
  • java-多线程 String 常量池缓存功能带来的问题

    在JVM中有string常量池缓存的功能。 

    package com.leran.thread.demo1;

    public class Test {
    public static void main(String[] args) {
    String a = "a";
    String b = "a";
    System.out.println(a == b);
    }

    }

    结果:true;

    for  example:

    public class Service {
    public static void print(String stringParam) {
    try {
    synchronized (stringParam) {
    while (true) {
    System.out.println(Thread.currentThread().getName());
    Thread.sleep(1000);
    }
    }

    } catch (Exception e) {
    e.printStackTrace();
    }

    }

    }

    package com.leran.thread.demo1;

    public class ThreadA extends Thread {
    private Service service;
    public ThreadA(Service service){
    super();
    this.service=service;
    }

    @Override
    public void run() {
    service.print("AA");
    }

    }

    package com.leran.thread.demo1;

    public class ThreadB extends Thread {
    private Service service;
    public ThreadB(Service service){
    super();
    this.service=service;
    }

    @Override
    public void run() {
    service.print("AA");
    }

    }

    package com.leran.thread.demo1;

    public class Test {
    public static void main(String[] args) {
    Service service = new Service();
    ThreadA a = new ThreadA(service);
    a.setName("A");
    a.start();
    ThreadB b = new ThreadB(service);
    b.setName("A");
    b.start();
    }

    }

    输出结果是:  A A A A A.....

    出现这样的结果就是因为String的两个值都是AA,两个线程持有相同的锁,所以造成线程B不能执行。这就是String常量池所带来的问题。因此

    在大多数情况下,同步synchronized代码块都不使用String作为锁对象,而改用其他,比如new Object()实例化Object对象,但它不放入缓存池中。

  • 相关阅读:
    Windows-Redis-x64-5.0.9【感谢大佬】
    Debezium初试
    一键结束进程
    Vscode自动刷新
    从零到一搭建一个jenkins+github持续构建平台
    git项目迁移
    AWS IoT 消息代理
    解析器:request.body、request.POST、request.data
    Unity程序员的Unreal 简明教程(二,模型与材质)
    Unity程序员的Unreal 简明教程(一、旋转的BOX)
  • 原文地址:https://www.cnblogs.com/caibixiang123/p/7500425.html
Copyright © 2011-2022 走看看