按我的理解,当一个线程需要获取的锁被另一个线程占用时,将进入阻塞态。但实际好像不是这样的,下面是我的代码。
在run方法中会调用MyBlock的isBlocked方法,该方法添加了synchronized限定。
在main方法中创建两个线程:t1和t2,t1运行后,由于isBlocked方法运行需要一定时间,t2应该进入阻塞态。但我调用getState方法得到的是Runnable,不是Blocked。
这是为啥呢?
public class TestThread implements Runnable { private String mThreadName = null; private MyLock mLock = null; public TestThread(String name, MyLock l){ mThreadName = name; mLock = l; } @Override public void run() { // TODO Auto-generated method stub subTask(); } private void subTask() { System.out.println(mThreadName + "START!"); mLock.isLocked(); System.out.println(mThreadName + "END!"); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub MyLock lock = new MyLock(); TestThread r1 = new TestThread("A", lock); Thread t1 = new Thread(r1); t1.start(); TestThread r2 = new TestThread("B", lock); Thread t2 = new Thread(r2); t2.start(); System.out.println(t2.getState()); //t2.interrupt(); System.out.println(t2.getState()); System.out.println("MAIN END!"); } public static class MyLock{ private ReentrantLock mLock = new ReentrantLock(); public synchronized void isLocked(){ System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); for (int i = 0; i < 10000; i ++){ System.out.print("," + i); } System.out.println("#############################"); } } }
牛魔王的故事
茅侃侃
白板的微信
相关分类