监测一个类里面有两个synchronized方法是否可以同步执行

public class SychronizedMethod {

    public synchronized void test1() {

        System.out.println("test1 entry");
        System.out.println("test1 out");
    }

    public synchronized void test2() {

        System.out.println("test2 entry");
        try {
            Thread.sleep(10000);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        System.out.println("test2 out");
    }

    public static void main(String[] args) {

        SychronizedMethod sychronizedMethod = new SychronizedMethod();
        WorkHandler handler = new WorkHandler(sychronizedMethod);
        WorkHandler1 handler1 = new WorkHandler1(sychronizedMethod);
        Thread t1 = new Thread(handler);
        Thread t2 = new Thread(handler1);
        t1.start();
        t2.start();

    }
}


public class WorkHandler1 implements Runnable {

    private SychronizedMethod syn;

    WorkHandler1(SychronizedMethod syn) {
        this.syn = syn;
    }

    @Override
    public void run() {

        syn.test1();
    }
}

public class WorkHandler implements Runnable {

    private SychronizedMethod syn;

    WorkHandler(SychronizedMethod syn) {
        this.syn = syn;
    }

    @Override
    public void run() {

        syn.test2();
    }
}

结果:

test2 entry
test2 out
test1 entry
test1 out

 

结论:jvm在执行方法以前,如果发现该方法前面有对象的synchronized关键字,就现在该对象的ID上加锁,当其他线程执行同时执行这个方法时,会检测改对象ID上是否加锁,如果加锁时就等待锁释放。 所以两个synchronized方法要排队。

posted on 2016-11-24 10:41  我叫涛哥  阅读(1421)  评论(0)    收藏  举报

导航