- 博客(6)
- 收藏
- 关注
原创 关于集合类不安全的深度解析!!!
当调用 System.out.println(list) 时,会隐式调用 list.toString(),而 toString() 会遍历列表的所有元素(通过迭代器)。System.out.println(list) 会隐式调用 ArrayList 的 toString(),toString会遍历列表。System.out.println(list) 会调用 CopyOnWriteArrayList 的 toString() 方法,该方法遍历列表时使用的迭代器是基于当前数组的快照。
2025-03-17 23:28:39
750
原创 探究synchronized锁的八种现象
同一对象的同步方法共享同一把对象锁,线程1先调用 sendSms() 获取锁,线程2调用 call() 必须等待。静态同步方法锁的是整个类(Phone.class),而静态普通方法无需加锁,所以 call() 可立即执行。不同对象调用时,静态同步方法仍锁定类,而实例同步方法锁定各自对象,互不干扰,所以 call() 可立即执行。线程1在执行 sendSms() 时休眠 4 秒,持有锁期间,线程2调用 call() 必须等待锁释放。静态同步方法锁的是类,而实例同步方法锁的是对象。
2025-03-16 22:29:05
562
原创 Synchronized和Lock处理生产者消费者问题
当使用if判断条件时,线程仅在进入等待状态前检查一次条件。一旦被唤醒(无论是否满足条件),线程会直接执行后续代码,不再重新验证条件是否成立。notfify、signal 和notifyAll、signalAll的区别是有All和没All(没All表示唤醒一个,有All表示唤醒所有)Synchronized中可以使用Object类的wait和notify方法等待和唤醒。虚假唤醒:条件并没有满足,被唤醒了。Lock锁则是使用Condition类的await和signal方法等待和唤醒。
2025-03-11 15:15:14
292
原创 深入解析 Java 中的 synchronized 与 Lock:线程同步机制的核心区别与应用场景
当三个线程并发执行售票操作时,会出现以下问题:超卖(卖出超过库存数量的票)重复售票(同一票号被多次卖出)票号跳跃(打印顺序不符合预期)未加锁前,多个线程卖票存在支援抢占。
2025-03-09 19:36:59
469
原创 Java内存模型(JMM)
Java 内存模型(Java Memory Model),简称JMM。它定义了 Java 程序中的变量、线程如何和主存以及工作内存进行交互的规则。首先需要明白java的运行时数据区,如下图:方法区:存储了运行时常量池、字段和方法参数、构造方法等字节码数据。堆:几乎所有的对象实例及数组都存在这里。栈:每一个线程有一个私有的栈,用于存储局部变量、栈帧、动态链接、方法出口等。本地方法栈:与栈类似,不过进入本地方法栈的数据需要通过native关键字表明。
2025-03-03 16:29:18
806
转载 多线程中的三大问题!!!
有五个哲学家在用餐,每个人必须要同时拿两把叉子才开始就餐,如果哲学家 1 和哲学家 3 同时开始就餐,那哲学家 2、4、5 就得饿肚子等待了。当一个共享变量被 volatile 修饰时,它会保证修改的值立即更新到主存当中,当有其他线程需要读取时,就会从内存中读到新值。如上图,每个线程都有自己的工作内存,一般情况下线程会在自己的工作内存完成赋值操作,但不会及时刷新到主内存。不可见性:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。原子性:线程中很多操作不是原子性操作。
2025-03-02 12:20:15
11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人