線程安全-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();
    }

}

打印結果:ide

m1方法加了synchornized,是同步的,m2方法沒有加synchornized,是異步的,t一、和 t2線程雖然都執行的是MyObject的對象的方法,可是因爲m2是異步的方法,跟m1不要緊,因此直接打印出了。spa

若是將m2方法也加上synchornized修飾,此時t一、t2線程,都執行的是obj對象的方法,t1或者t2,誰先執行後,就得到了對象鎖,不釋放鎖,另外一個線程就得等着。線程

相關文章
相關標籤/搜索