thread14

来源:互联网 发布:回拨电话软件 编辑:程序博客网 时间:2024/06/05 01:51
package com.neutron.t14;import java.util.concurrent.TimeUnit;/** *  锁定某个对象o,如果o的属性发生改变,不会影响锁的使用。 *  如果o变成另外1个对象,则锁定的对象会发生改变。 *  所以应当避免将锁定对象的引用变成另外的对象 */public class T14 {    Object o = new Object();    public void tomiko() {        synchronized(o) {            while(true) {                try {                    TimeUnit.SECONDS.sleep(2);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println(Thread.currentThread().getName());            }        }    }    public static void main(String[] args) {        T14 t14 = new T14();        // 创建线程t1        new Thread(t14::tomiko, "t1").start();        try {            TimeUnit.SECONDS.sleep(2);        } catch (InterruptedException e) {            e.printStackTrace();        }        // t14的属性o的引用发生改变,相当于创建第2把锁        t14.o = new Object();        // 如果没有t14.o = new Object();那么线程t2将永远也不会执行        // 再次可以确认锁定的对象是在堆内存中,而不是在栈内存中        new Thread(t14::tomiko, "t2").start();    }}