多线程之synchronized
synchronized 是 Java 中的一个关键字用于实现线程同步确保在多线程环境下对共享资源的访问是安全的。它通过对象锁或类锁来控制同一时间只有一个线程可以执行被修饰的代码块或方法。1. synchronized 的作用synchronized 主要具有以下三个作用互斥性确保同一时间只有一个线程可以进入被 synchronized 修饰的代码块或方法其他线程必须等待。可见性保证共享变量的修改能够及时对其他线程可见。有序性通过禁止指令重排保证程序执行顺序与代码编写顺序一致。2. synchronized 的使用方式synchronized 可以用于以下几种形式1修饰实例方法publicsynchronizedvoidmethod(){// 同步代码块}2修饰静态方法当 synchronized 修饰一个静态方法时锁的是该类的 Class 对象。publicstaticsynchronizedvoidstaticMethod(){// 同步代码块}3修饰代码块可以使用 synchronized 块来指定具体的锁对象。synchronized(this){// 同步代码块}synchronized(Object.class){// 同步代码块}3. 锁的类型对象锁实例锁用于非静态方法或代码块锁的是对象实例。类锁静态锁用于静态方法或代码块锁的是类的 Class 对象。4. synchronized 的特性可重入性同一个线程可以多次获取同一个锁不会导致死锁。阻塞等待当一个线程尝试获取已被占用的锁时会进入等待队列直到锁被释放。锁升级机制在 Java 6 及以后版本中synchronized 会根据竞争情况动态升级锁的状态无锁 → 偏向锁 → 轻量级锁 → 重量级锁。5. synchronized 的性能影响虽然 synchronized 能够保证线程安全但过度使用会导致性能下降因为它会带来线程阻塞和上下文切换的开销。因此在使用时应尽量减小锁的范围避免长时间持有锁。