您的位置:首页 > 编程语言

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

2018-03-04 14:25 513 查看
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同步的只是方法内部的一个变量所以可以执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息