Java synchronized关键字用法(3)

@Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    im.comeInIn();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
           
        }, "t2");
        t1.start();
        t2.start();
    }
}

由以上代码可以看到: 在 comeInIn 方法中,运用  synchronized(this) 制造同步块,要执行同步块内的代码,就必须获得 this 对象的锁(调用 comeInIn 方法的对象)。

执行结果可能为:

Java synchronized关键字用法

由此执行结果可见:t1 线程先执行了 comeIn 方法,获得了对象 im 的锁,之后由于 t1 线程进入睡眠状态,t2 线程得到运行,开始执行 comeInIn 方法,当执行到同步代码块时发现对象 im 已被加锁,无法继续执行。t1 线程睡眠结束之后继续执行,结束后释放对象 im 的锁,t2 线程才能继续执行。

四、静态方法中使用 synchronized 关键字制造同步块

同步块中默认被加锁的对象是此同步块括号声明中包含的对象。

class staticMethodSynchronized {
    private static final Object OBJ = new Object();
    public static void method1() throws InterruptedException {
        System.out.println(Thread.currentThread().getName() + ": start");
        synchronized(OBJ) {
            System.out.println(Thread.currentThread().getName() + ": 获得锁");
            System.out.println(Thread.currentThread().getName() + ": 释放锁");
        }
        System.out.println(Thread.currentThread().getName() + ": finish");
    }
    public static void method2() throws InterruptedException {
        System.out.println(Thread.currentThread().getName() + ": start");
        synchronized(OBJ) {
            System.out.println(Thread.currentThread().getName() + ": 获得锁");
            System.out.println(Thread.currentThread().getName() + ": 释放锁");
        }
        System.out.println(Thread.currentThread().getName() + ": finish");
    }
}
public class TestStaticClassSynchronized {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {

@Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    staticMethodSynchronized.method1();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
           
        }, "t1");
        Thread t2 = new Thread(new Runnable() {

@Override
            public void run() {
                // TODO Auto-generated method stub
                try {
                    staticMethodSynchronized.method2();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
           
        }, "t2");
        t1.start();
        t2.start();
    }
}

在上述代码中,两个静态方法中的同步块都要获得对象 OBJ 的锁才能继续向下执行,执行结果可能如下:

Java synchronized关键字用法

若 t1 线程先获得锁,则必须等到 t1 释放锁之后,t2 线程中同步代码块及其之后的代码才能继续执行,t2 线程先获得锁,t1 线程同理。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/98ff92272ae108682121765bfe4a0b23.html