String字面量做同步锁存在的问题

碰到一个问题就是想要使用两个对象锁控制同一个类的两个方法在多线程环境的同步问题。目标是两个方法可以同时由不同的线程获取不同的锁同时执行,互不影响。通过定义两个String对象作为对象锁存在的问题。

如果用两个String变量使用相同的字面量定义

由于代码中定义的字面量编译后在字符串常量池中引用的都是相同的对象,因此实际上两个String对象是同一对象锁

所以使用String对象做Synchronized同步锁时要注意定义方式,最好通过new的方式。

package com.teriste.thread;

public class StringSyncTest {

    static class OpString{

        /**
         * 目标是通过s1和s2两个对象作为锁控制op1和op2多线程环境下的安全性
         * 1、s1和s2通过字面量赋值,由于引用的常量池中相同的对象导致没有实现两个锁分别控制方法线程安全的目标
         * 2、通过new的方式使用不同对象来达到两个方法多线程环境下分别锁两个对象
         * String s1 = new String("aaa");
         * String s2 = new String("aaa");
         */
        String s1 = "aaa";
        String s2 = "aaa";

        /**
         * 方法一通过对象s1作为锁控制多线程并发
         */
        public void op1(){
            synchronized (s1){
                while (true){
                    System.out.println("T1");
                }
            }
        }

        /**
         * 方法二通过对象s2作为锁控制多线程并发
         */
        public void op2(){
            synchronized (s2){
                while (true){
                    System.out.println("T2");
                }
            }
        }
    }

    public static void main(String[] args) {
        OpString opString = new OpString();
        Thread t1 = new Thread(opString::op1,"t1");
        Thread t2 = new Thread(opString::op2,"t2");
        t1.start();
        t2.start();
    }
}

 

你可能感兴趣的:(Java)