Java内置锁

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zwdwinter/article/details/52901782

启动类

public class LockTest {
    public static void main(String[] args) {
        ObjLock test = new ObjLock();
        for (int i = 0; i < 5; i++) {
            Thread thread = new LockThread(test);
            thread.start();
        }
    }
}

线程类

public class LockThread extends Thread {

    ObjLock lock;

    public LockThread(ObjLock lock) {
        this.lock = lock;
    }

    public void run() {
        lock.syncObjMethod1();

        lock.syncObjMethod2();

        lock.syncPriObjMethod();

        ObjLock.syncClaMethod();
    }

    /**
     * 私有锁和对象锁不会产生竞争
     * synchronized加在方法上和synchronized(this)均是对当前对象加锁,构成竞争关系同一时刻只能有一个方法能执行。
     */
}

方法类

public class ObjLock {

    /** 私有对象 */
    private Object object = new Object();

    /**
     * 对象锁方法
     */
    public synchronized void syncObjMethod1() {
        System.out.println("Obj Lock 1 begin" + ", time = " + System.currentTimeMillis() + "ms");
        try {
            Thread.sleep(2000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Obj Lock 1 end");
    }

    /**
     * 对象锁(采用synchronized (this))
     */
    public void syncObjMethod2() {
        synchronized (this) {
            System.out.println("Obj Lock 2 begin" + ", time = " + System.currentTimeMillis() + "ms");
            try {
                Thread.sleep(2000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Obj Lock 2 end");
        }

    }

    /**
     * 私有对象锁
     */
    public void syncPriObjMethod() {
        synchronized (object) {
            System.out.println("Private Lock begin" + ", time = " + System.currentTimeMillis() + "ms");
            try {
                Thread.sleep(2000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Private Lock end");
        }
    }

    // 用于Class类锁计数
    private static int claClockCount = 0;

    /**
     * 静态同步方法调用的是Class对象锁
     */
    public static synchronized void syncClaMethod() {
        System.out.println(
                "Class Lock begin claClockCount = " + claClockCount + ", time = " + System.currentTimeMillis() + "ms");
        claClockCount++;
        try {
            Thread.sleep(2000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Class Lock end");
    }
}

猜你喜欢

转载自blog.csdn.net/zwdwinter/article/details/52901782