4.加锁 this 创建多个类实例
最后一个示例最为特殊,我们使用 synchronized 加锁 this,让这 5 个线程调用各自创建对象的方法,具体示例如下:
import java.util.Date; import java.util.concurrent.TimeUnit; publicclass SynchronizedExample { public static void main(String[] args) { // 创建 5 个线程执行任务 for (int i = 0; i < 5; i++) { new Thread(new Runnable() { @Override public void run() { try { // 创建(多个)类实例 SynchronizedExample example = new SynchronizedExample(); // 调用 synchronized 修饰的 this 方法 example.thisMethod(); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } } /** * synchronized 修饰的 this 方法 * @throws InterruptedException */ public void thisMethod() throws InterruptedException { synchronized (this) { System.out.println(String.format("当前执行线程:%s,执行时间:%s", Thread.currentThread().getName(), new Date())); TimeUnit.SECONDS.sleep(1); } } }
以上程序的执行结果如下:
从上述结果可以看出,当使用 synchronized 加锁 this 时,如果线程调用的不是同一个对象,那么这些线程之间使用的锁都是自己独立的锁,这个结果就和 synchronized 加锁 class 的结果完全不同了。