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同步的只是方法内部的一个变量所以可以执行。