Java并发13:synchronized原理与使用 - 重量级锁的前世今生
引言:从一个线程安全问题说起 看这个经典的银行转账问题: public class BankAccount { private int balance = 1000; public void transfer(BankAccount target, int amount) { this.balance -= amount; // 1. 扣款 target.balance += amount; // 2. 入账 } } // 两个线程同时转账 Thread t1 = new Thread(() -> accountA.transfer(accountB, 100)); Thread t2 = new Thread(() -> accountB.transfer(accountA, 200)); t1.start(); t2.start(); 问题:可能发生死锁或数据不一致! 解决方案:使用synchronized public synchronized void transfer(BankAccount target, int amount) { this.balance -= amount; target.balance += amount; } 三个疑问: synchronized是如何保证线程安全的? 为什么它能同时保证原子性、可见性、有序性? 它的性能开销来自哪里? 本篇文章将深入synchronized的底层原理,从对象头到Monitor机制,彻底理解Java最基础的同步机制。 一、synchronized的三种使用方式 1.1 修饰实例方法 public class Counter { private int count = 0; public synchronized void increment() { count++; } // 等价于: // public void increment() { // synchronized (this) { // count++; // } // } } 锁对象:当前实例(this) ...