区别:同步方法锁的粒度粗,并发执行效率低,相反的,同步代码块锁的粒度细,并发效率高;根据实际情况选择。
代码例示如下:
package com.company;
/*
*同步代码块与同步方法的选择问题
* 同步方法锁的粒度粗,并发执行效率低,相反的,同步代码块锁的粒度细,并发效率高;根据实际情况选择
* */
public class Test07 {
public static void main(String[] args) {
Test07 obj=new Test07();
//开启一个线程
new Thread(new Runnable() {
@Override
public void run() {
obj.doLongTask();
}
}).start();
//再开启一个新的线程
new Thread(new Runnable() {
@Override
public void run() {
obj.doLongTask();
}
}).start();
}
//使用同步代码块,消耗时间为准备的时间3秒+两个for循环
public void doLongTask01(){
System.out.println("Task Begin");
try {
Thread.sleep(3000); //模拟任务需要准备3分钟
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (this){
System.out.println("开始同步");
for (int i=0;i<=100;i++){
System.out.println(Thread.currentThread().getName()+"--->"+i);
}
}
System.out.println("Task end");
}
//使用同步方法,消耗的时间为3个准备时间3+3秒和两个for循环的时间
public synchronized void doLongTask(){
System.out.println("Task Begin");
try {
Thread.sleep(3000); //模拟任务需要准备3分钟
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("开始同步");
for (int i=0;i<=100;i++){
System.out.println(Thread.currentThread().getName()+"--->"+i);
}
System.out.println("Task end");
}
}