首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 多线程编程中 synchronized 关键字基本用法详解

     編輯:Java 相關知識

同步核心:锁与共享资源

Java 线程同步核心是共享资源的访问控制。JVM 中线程共享的数据包括:

  • 堆中的实例变量
  • 方法区的类变量(static 变量)

每个对象或类关联一个监视器,监视器通过对象锁(隐式锁)实现互斥。类锁本质也是通过 Class 对象实现。锁支持重入:同一线程可多次获取同一锁,JVM 维护计数器,计数器归零才释放。

synchronized 两种基本形式

1. 同步代码块

synchronized (共享对象引用) {
    // 临界区
}

显式指定锁对象,灵活控制锁粒度。

2. 同步方法

  • 实例同步方法:synchronized void method() → 锁是 this(当前实例)。
  • 静态同步方法:static synchronized void method() → 锁是 当前类.class 对象。

常见误区:非共享锁对象导致同步失效

// 错误示例:每个线程持有不同锁
public class TestThread extends Thread {
    @Override
    public synchronized void run() { // 锁是 this,每个线程 this 不同
        for (int i = 0; i < 1000; i++) {
            System.out.println("NO." + threadNum + ":" + i);
        }
    }
}

10 个线程各自创建 TestThread 实例,锁对象不同,无法互斥,输出交错。

修正:共享锁对象

public class TestThread extends Thread {
    private final String sharedLock; // 共享字符串对象

    public TestThread(int threadNum, String sharedLock) {
        this.threadNum = threadNum;
        this.sharedLock = sharedLock;
    }

    @Override
    public void run() {
        synchronized (sharedLock) { // 同步块指定共享锁
            for (int i = 0; i < 1000; i++) {
                System.out.println("NO." + threadNum + ":" + i);
            }
        }
    }

    public static void main(String[] args) {
        String lock = "sharedLock"; // 单一共享对象
        for (int i = 0; i < 10; i++) {
            new TestThread(i, lock).start();
        }
    }
}

所有线程同步于同一 sharedLock,输出按序执行。

静态同步方法实现类级互斥

public class TestThread extends Thread {
    public static synchronized void staticTest(int threadNum) {
        for (int i = 0; i < 1000; i++) {
            System.out.println("NO." + threadNum + ":" + i);
        }
    }
    @Override public void run() { staticTest(threadNum); }
}

静态方法锁住 TestThread.class,所有线程共享类锁,自然同步。

总结

形式锁对象适用场景
同步代码块指定对象引用精细控制锁粒度、非 this 锁
实例同步方法this(当前实例)简单场景,需单例或共享实例
静态同步方法当前类.class类级共享资源,天然全局互斥

核心原则:同步必须锁定共享对象,否则同步失效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved