同步块和同步方法之间的经典区别是同步方法锁定整个对象。同步块只是将代码锁定在该块内。
同步方法:基本上这两种同步方法禁用多线程。因此,一个线程完成method1(),另一个线程等待Thread1完成。
类SyncExerciseWithSyncMethod {
public synchronized void method1() {
try {
System.out.println("In Method 1");
Thread.sleep(5000);
} catch (Exception e) {
System.out.println("Catch of method 1");
} finally {
System.out.println("Finally of method 1");
}
}
public synchronized void method2() {
try {
for (int i = 1; i < 10; i++) {
System.out.println("Method 2 " + i);
Thread.sleep(1000);
}
} catch (Exception e) {
System.out.println("Catch of method 2");
} finally {
System.out.println("Finally of method 2");
}
}
}
输出量
在方法1中
方法1的最后
方法2 1
方法2 2
方法2 3
方法2 4
方法2 5
方法2 6
方法2 7
方法2 8
方法2 9
方法2的最后
同步块:使多个线程可以同时访问同一对象[启用多线程]。
类SyncExerciseWithSyncBlock {
public Object lock1 = new Object();
public Object lock2 = new Object();
public void method1() {
synchronized (lock1) {
try {
System.out.println("In Method 1");
Thread.sleep(5000);
} catch (Exception e) {
System.out.println("Catch of method 1");
} finally {
System.out.println("Finally of method 1");
}
}
}
public void method2() {
synchronized (lock2) {
try {
for (int i = 1; i < 10; i++) {
System.out.println("Method 2 " + i);
Thread.sleep(1000);
}
} catch (Exception e) {
System.out.println("Catch of method 2");
} finally {
System.out.println("Finally of method 2");
}
}
}
}
输出量
在方法1中
方法2 1
方法2 2
方法2 3
方法2 4
方法2 5
方法1的最后
方法2 6
方法2 7
方法2 8
方法2 9
方法2的最后