Synchronize对String加锁

Posted 量变决定质变

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Synchronize对String加锁相关的知识,希望对你有一定的参考价值。

Synchronize

尽量,不要使用String常量加锁
会出现死循环问题

package com.bjsxt.base.sync006;

/**
 * synchronized代码块对字符串的锁,注意String常量池的缓存功能
 *
 */
public class StringLock 

    public void method() 
        // new String("字符串常量")
        synchronized ("字符串常量") 
            try 
                while (true) 
                    System.out.println("当前线程 : " + Thread.currentThread().getName() + "开始");
                    Thread.sleep(1000);
                    System.out.println("当前线程 : " + Thread.currentThread().getName() + "结束");
                
             catch (InterruptedException e) 
                e.printStackTrace();
            
        
    

    public static void main(String[] args) 
        final StringLock stringLock = new StringLock();
        Thread t1 = new Thread(new Runnable() 
            @Override
            public void run() 
                stringLock.method();
            
        , "t1");
        Thread t2 = new Thread(new Runnable() 
            @Override
            public void run() 
                stringLock.method();
            
        , "t2");

        t1.start();
        t2.start();
    

运行

因为,String的引用只有一个
所以,t1一直在执行,t2无法得到执行

以上是关于Synchronize对String加锁的主要内容,如果未能解决你的问题,请参考以下文章

21 synchronized

深入研究 Java Synchronize 和 Lock 的区别与用法

JAVA编程同步,加锁如何实现,有何优缺点?

使用guava进行对字符串的加锁

4.显式锁 Lock

多线程2-synchronize