同步块里面对象锁的细节

synchronized块相对于方法声明加synchronized关键字,更加灵活

例子

public class FetchRunnable implements Runnable{    private String TAG_1 = new String("TAG_1");//锁this    private static String TAG_2 = new String("TAG_2");//锁class    private String TAG_3 = "TAG_3";//锁class    public void run() {        //runClass();        //runThis();        runTag(TAG_1);        sleep();        runTag(TAG_2);        sleep();        runTag(TAG_3);    }    private void runClass() {        synchronized (FetchRunnable.class) {            System.out.println("run Class");            sleep();        }    }    private void runThis() {        synchronized (this) {            System.out.println("run this");            sleep();        }    }    private void runTag(String tag) {        synchronized (tag) {            System.out.println(Thread.currentThread().getName() + " run " + tag +" 秒="+Calendar.getInstance().get(Calendar.SECOND));            sleep();        }    }    private void sleep() {        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            e.printStackTrace();        }    }    public static void main(String[] args) {        Thread t0 = new Thread(new FetchRunnable());        Thread t1 = new Thread(new FetchRunnable());        t0.start();        t1.start();    }}

运行结果

Thread-0 run TAG_1 秒=18Thread-1 run TAG_1 秒=18Thread-1 run TAG_2 秒=20Thread-0 run TAG_2 秒=21Thread-1 run TAG_3 秒=22Thread-0 run TAG_3 秒=23