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

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

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();

    }

}

运行结果:

进入同步区域 我是男一号

进入同步区域 我是女一号

离开同步区域 我是男一号

离开同步区域 我是女一号

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

你可能感兴趣的:(局部变量)