看到一种这样的写法,创键一个局部变量,并锁住这个变量,
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(); } }
运行结果:
进入同步区域 我是男一号
进入同步区域 我是女一号
离开同步区域 我是男一号
离开同步区域 我是女一号
女一号还是打断了男一号的思考。并没有锁住。