多线程:synchronized同步方法和同步代码快的区别

sychronized同步方法和同步代码块的区别,sychronized可以分为四种使用情况:

同步实例方法,

同步实例代码块,

同步静态方法,

同步静态代码块。

    上一篇对实例方法和静态方法做了对比得出结论:多个线程可以异步操作同一个类的多个sychronized类型实例方法,但是多个线程却不可以操作一个类的sychronized类型的静态方法。可以理解为实例方法同步的是对象,而静态方法同步的是整个类。

    接下来讨论一下同步方法和同步代码块的区别,以实例的为例。

代码如下:

public class Var {

    synchronized public void methodA(){
        try {
            System.out.println(Thread.currentThread().getName() + " run method A " + System.currentTimeMillis());
            Thread.sleep(3000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }

    public void methodB(){
        synchronized (this){
            System.out.println(Thread.currentThread().getName() + " run method B " + System.currentTimeMillis());
        }
    }

    public void methodC(){
        String syn = "synchtronized";
        synchronized (syn){
            System.out.println(Thread.currentThread().getName() + " run method C " + System.currentTimeMillis());
        }
    }

}
public class Test {
    public static void main(String[] args) {
        Var var = new Var();

        new Thread(new Runnable() {
            @Override
            public void run() {
                var.methodA();
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                var.methodB();
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                var.methodC();
            }
        }).start();

    }
}

执行结果:

Thread-0 run method A 1520142974301
Thread-2 run method C 1520142974301
Thread-1 run method B 1520142977302

    可以看到方法B比其两个方法打印慢3秒,线程Threa-0首先获得对象var的锁,接着线程Thread-0会休眠3秒,这时虽然线程Thread-1先进入线程规划器,但是因为方法methodB内部使用了sychronized代码块,而且使用了this,这个作用类似于同步方法,所以无法执行。而因为methodC同步的只是方法内部的一个变量所以可以执行。



猜你喜欢

转载自blog.csdn.net/fanxing1964/article/details/79435998