线程安全-003-对象锁的同步和异步

对象锁的同步和异步

 例子程序:

package com.lhy.thread01;

/**
 * 对象锁的同步和异步问题
 * @author dev
 */
public class MyObject {
    
    //synchronized
    public synchronized void m1(){
        try {
            System.err.println(Thread.currentThread().getName());
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    //synchronized
    public  void m2(){
        try {
            System.err.println(Thread.currentThread().getName());
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }        
    
    public static void main(String[] args) {

        final MyObject obj = new MyObject();
        /**
         * 分析:
         * t1线程先持有obj对象的Lock锁,t2线程可以以异步的方式调用对象中的非synchornized修饰的方法
         * t1线程先持有obj对象的Lock锁,t2线程如果在这个时候调用对象中的同步(synchornized)方法则需等待,也就是同步
         */
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                obj.m1();
            }
        },"t1");
        
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                obj.m2();
            }
        },"t2");
        
        t1.start();
        t2.start();
    }

}

打印结果:

m1方法加了synchornized,是同步的,m2方法没有加synchornized,是异步的,t1、和 t2线程虽然都执行的是MyObject的对象的方法,但是由于m2是异步的方法,跟m1没关系,所以直接打印出了。

如果将m2方法也加上synchornized修饰,此时t1、t2线程,都执行的是obj对象的方法,t1或者t2,谁先执行后,就获得了对象锁,不释放锁,另一个线程就得等着。

猜你喜欢

转载自www.cnblogs.com/lihaoyang/p/10539817.html