synchronized深入理解

synchronized
注意:在一个类中,不管有几个方法进行了同步(synchronized),这些同步方法都共有一把锁,只要一个线程获得了这个对象锁,其他的线程就不能访问该对象的任何一个同步方法,但是可以访问其他的非同步方法;
synchronized可重入机制:
即在一个 synchronized 方法/块的内部调用本类的其他 synchronized 方法/块时,是永远可以得到锁的;

synchronized实现任务的顺序执行示例:

Main.java

package com.shunxu;

/**
 * @Auther: 13213
 * @Date: 2020/5/30 17:10
 * @Description:
 */
public class Main {
    synchronized public void serviceMethod(){
        try {
            System.out.println("init main 下一步 sleep begin ThreadName="+Thread.currentThread().getName()+" time="+System.currentTimeMillis());
            Thread.sleep(5000);
            System.out.println("init main 下一步 sleep end ThreadName="+Thread.currentThread().getName()+" time="+System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Sub.java

package com.shunxu;

/**
 * @Auther: 13213
 * @Date: 2020/5/30 17:15
 * @Description:
 */
public class Sub extends Main{
    @Override
    public void serviceMethod() {
        try {
            System.out.println("init sub 下一步 sleep begin ThreadName="+Thread.currentThread().getName()+" time="+System.currentTimeMillis());
            Thread.sleep(5000);
            System.out.println("init sub 下一步 sleep end ThreadName="+Thread.currentThread().getName()+" time="+System.currentTimeMillis());
            super.serviceMethod();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

MyThreadA,java

package com.shunxu;

/**
 * @Auther: 13213
 * @Date: 2020/5/30 17:17
 * @Description:
 */
public class MyThreadA extends Thread{
    private Sub sub;

    public MyThreadA(Sub sub) {
        super();
        this.sub = sub;
    }
    @Override
    public void run(){
        sub.serviceMethod();
    }
}

MyThreadB.java

package com.shunxu;

/**
 * @Auther: 13213
 * @Date: 2020/5/30 17:21
 * @Description:
 */
public class MyThreadB extends Thread{
    private Sub sub;

    public MyThreadB(Sub sub) {
        super();
        this.sub = sub;
    }
    @Override
    public void run(){
        sub.serviceMethod();
    }
}

Test.java

package com.shunxu;

/**
 * @Auther: 13213
 * @Date: 2020/5/30 17:22
 * @Description:
 */
public class Test {
    public static void main(String[] args) {
        Sub sub = new Sub();
        MyThreadA a = new MyThreadA(sub);
        a.setName("A");
        a.start();
        MyThreadB b = new MyThreadB(sub);
        b.setName("B");
        b.start();
    }
}

运行结果:

将子类中的方法加关键字synchronized进行同步后:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章