局部变量的同步锁是无效的。

看到一种这样的写法,创键一个局部变量,并锁住这个变量,

public void test(){
    Integer t = new Integer();
    synchronized(t){
        do...   
    }
}

感觉有点不对,写了一段测试代码

package cn.angelshelter.fanmore.test;

public class ThreadTest extends Thread{

    private String name;
    
    public ThreadTest(String name){
        this.name = name;
    }

    @Override
    public void run() {
        test();
    }
    
    public void test(){
        Double t = Math.random();
        synchronized(t){
            System.out.println("进入同步区域 " + name);
            try {
                Thread.sleep(5000);  //睡5s
            } catch (InterruptedException e) {
                e.printStackTrace();
            }  
            System.out.println("离开同步区域 " + name);
        }
    }
    
    public static void main(String[] args) {
        ThreadTest t1 = new ThreadTest("我是男一号");
        t1.start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        ThreadTest t2 = new ThreadTest("我是女一号");
        t2.start();
    }
}

运行结果:

进入同步区域 我是男一号
进入同步区域 我是女一号
离开同步区域 我是男一号
离开同步区域 我是女一号

女一号还是打断了男一号的思考。并没有锁住。

原文地址:https://www.cnblogs.com/angelshelter/p/4205564.html