当前位置: 首页 > news >正文

阿里计算机专业面试宝典1

1. synchronized 和 Lock 有哪些区别,使用场景,如何有效阅读 synchronized 的源码

  • 定义
  1. synchronized:它是 Java 的内置关键字,用于实现同步机制,保证在同一时刻只有一个线程可以访问被 synchronized 修饰的代码块或方法,从而避免多线程并发访问导致的数据不一致问题。
  2. LockLock 是 Java 中的一个接口,它提供了比 synchronized 更灵活的锁机制。通过 Lock 接口的实现类(如 ReentrantLock),可以手动控制锁的获取和释放。
  • 区别
  1. 语法层面synchronized 是 Java 语言层面的关键字,使用起来较为简洁;Lock 是一个接口,需要显式地调用 lock() 和 unlock() 方法来获取和释放锁。
  2. 锁的获取和释放synchronized 会自动释放锁,当同步代码块执行完毕或者出现异常时;Lock 必须手动调用 unlock() 方法释放锁,通常将其放在 finally 块中以确保异常情况下也能释放。
  3. 锁的特性synchronized 是非公平锁;Lock 可以实现公平锁和非公平锁,如 ReentrantLock 可以通过构造函数指定是否为公平锁。
  4. 锁的状态synchronized 无法判断锁的状态;Lock 可以通过 tryLock() 方法尝试获取锁并返回是否成功,还能通过 isLocked() 判断锁的状态。
  • 使用场景
  1. synchronized:适用于代码简单、并发度不高的场景,因为其使用方便,由 JVM 自动管理锁的获取和释放。
  2. Lock:适用于复杂的同步场景,如需要实现公平锁、可中断锁、超时锁等功能。

代码示例

java

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

// 使用 synchronized 的示例
class SynchronizedExample {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }
}

// 使用 Lock 的示例
class LockExample {
    private int count = 0;
    private final Lock lock = new ReentrantLock();

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }

    public int getCount() {
        return count;
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        // 使用 synchronized 的测试
        SynchronizedExample syncExample = new SynchronizedExample();
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                syncExample.increment();
            }
        });
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                syncExample.increment();
            }
        });
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println("Synchronized count: " + syncExample.getCount());

        // 使用 Lock 的测试
        LockExample lockExample = new LockExample();
        t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                lockExample.increment();
            }
        });
        t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                lockExample.increment();
            }
        });
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println("Lock count: " + lockExample.getCount());
    }
}

 

2. 如何有效阅读 synchronized 的源码

  1. 了解 Java 对象头:synchronized 是基于对象头中的 Mark Word 来实现锁的,先了解 Mark Word 的结构和状态变化。
  2. 从字节码层面入手:通过 javap -c 命令查看包含 synchronized 代码的字节码,了解其底层指令。
  3. 结合 JVM 源码:可以查看 HotSpot JVM 的源码,重点关注 ObjectMonitor 类,synchronized 的底层实现与它密切相关。
  • 应用

  1. synchronized:在简单的多线程共享资源场景中广泛应用,如计数器、单例模式的懒汉式实现等。
  2. Lock:在复杂的并发场景中使用,如读写锁场景(ReentrantReadWriteLock)、需要可中断锁的场景等。

 

3. JVM 如何实现自动内存管理, Minor GC 与 Full GC 的触发机制

 

  • 定义
  1. JVM 自动内存管理:JVM 自动管理 Java 程序的内存分配和回收,开发者无需手动分配和释放内存,避免了内存泄漏和悬空指针等问题。
  2. Minor GC:也称为新生代垃圾回收,主要回收新生代中的垃圾对象。
  3. Full GC:也称为全局垃圾回收,会回收整个堆内存,包括新生代、老年代和永久代(Java 8 之前)或元空间(Java 8 及以后)。
  • JVM 自动内存管理原理

相关文章:

  • javaweb的基础2
  • 【计算机网络】什么是路由?核心概念与实战详解
  • 群晖如何通过外网访问
  • KingbaseES之KDts迁移SQLServer
  • 安徽京准:GPS北斗卫星时空信号安全防护装置(授时)介绍
  • 【Unity笔记】Unity超时检测器开发:支持自定义重试次数与事件触发
  • AIP-231 批量方法:Get
  • 树莓派超全系列教程文档--(24)本地化设置、SSH及配置防火墙
  • 本地mock服务编写
  • 如何优雅地处理 API 版本控制?
  • 滚轮控制目标臂长度调整相机距离
  • CTF--shell
  • 自动驾驶第一性原理
  • java -jar 如何持久化运行
  • 华三IRF堆叠技术
  • Redis 5.0、6.0 和 7.0 版本的核心更新特性总结
  • flutter 打包mac程序 dmg教程
  • 【CUDA 】第3章 CUDA执行模型——3.5循环展开(1)
  • 探讨HMI(人机界面)设计原则,如何通过优秀的设计提升操作效率和用户体验
  • 第二十六:Map的基本原理
  • 广西北海市人大常委会副主任李安洪已兼任合浦县委书记
  • A股三大股指涨跌互现,工农中三大行股价创新高
  • 韩国检方以受贿嫌疑起诉前总统文在寅
  • 中纪报刊文:新时代反腐败斗争为党赢得历史主动
  • 主刀完成3万余例手术,81岁神经外科学专家徐启武逝世
  • A股三大股指涨跌互现:人形机器人产业链爆发,两市成交超1.2万亿元