上一页 1 ··· 19 20 21 22 23 24 25 26 27 ··· 33 下一页
摘要: ReentrantReadWriteLock 是 Java 的一种读写锁,它允许多个读线程同时访问,但只允许一个写线程访问(会阻塞所有的读写线程)。这种锁的设计可以提高性能,特别是在读操作的数量远远超过写操作的情况下。 在并发场景中,为了解决线程安全问题,我们通常会使用关键字 synchronize 阅读全文
posted @ 2024-07-23 15:08 _Sylvan 阅读(54) 评论(0) 推荐(0)
摘要: ReentrantLock 重入锁,是实现Lock 接口 的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源重复加锁,即当前线程获取该锁后再次获取不会被阻塞。 要想支持重入性,就要解决两个问题: 在线程获取锁的时候,如果已经获取锁的线程是当前线程的话则直接再次获取成功; 阅读全文
posted @ 2024-07-23 14:18 _Sylvan 阅读(89) 评论(0) 推荐(0)
摘要: 锁的分类 乐观锁、悲观锁 对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java 中,synchronized 关键字是最典型的悲观锁。 乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会加锁,只是 阅读全文
posted @ 2024-07-23 13:53 _Sylvan 阅读(59) 评论(0) 推荐(0)
摘要: AQS是AbstractQueuedSynchronizer的简称,即抽象队列同步器,从字面上可以这样理解: 抽象:抽象类,只实现一些主要逻辑,有些方法由子类实现; 队列:使用先进先出(FIFO)的队列存储数据; 同步:实现了同步的功能。 AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单 阅读全文
posted @ 2024-07-21 15:46 _Sylvan 阅读(115) 评论(0) 推荐(0)
摘要: linux 下预构建二进制文件安装 Nodejs Nodejs预购建二级制文件下载地址 安装 Nodejs 和 npm # 解压 tar xvf node-v20.15.1-linux-x64.tar.xz # 移动解压出的文件夹到 /usr/local下,并且重命名为nodejs mv ./nod 阅读全文
posted @ 2024-07-20 20:04 _Sylvan 阅读(53) 评论(0) 推荐(0)
摘要: 在 Java 中,我们可以使用 synchronized 关键字和 CAS 来实现加锁效果。 悲观锁: 对于悲观锁来说,它总是认为每次访问共享资源时会发生冲突,所以必须对每次数据操作加上锁,以保证临界区的程序同一时间只能有一个线程在执行。 synchronized 是悲观锁,尽管随着 JDK 版本的 阅读全文
posted @ 2024-07-19 19:06 _Sylvan 阅读(58) 评论(0) 推荐(0)
摘要: public class Test { static int i; public void test() { synchronized (this) { i++; } } } 0 aload_0 1 dup 2 astore_1 // monitorenter 指令在编译后会插入到同步代码块的开始位 阅读全文
posted @ 2024-07-19 18:15 _Sylvan 阅读(81) 评论(0) 推荐(0)
摘要: Java 多线程的锁都是基于对象的,Java 中的每一个对象都可以作为一个锁。 类锁,其实就是 Class 对象的锁。 Class 对象是一种特殊的 Java 对象,代表了程序中的类和接口。Java 中的每个类型(包括类、接口、数组以及基础类型)在 JVM 中都有一个唯一的 Class 对象与之对应 阅读全文
posted @ 2024-07-19 15:41 _Sylvan 阅读(125) 评论(0) 推荐(0)
摘要: 在 Java 中,关键字 synchronized 可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作),同时我们还应该注意到 synchronized 的另外一个重要的作用,synchronized 可保证一个线程的变化(主要是共享数据的变 阅读全文
posted @ 2024-07-19 14:46 _Sylvan 阅读(83) 评论(0) 推荐(0)
摘要: volatile 可以保证可见性,但不保证原子性: 当写一个 volatile 变量时,JMM 会把该线程在本地内存中的变量强制刷新到主内存中去; 这个写操作会导致其他线程中的 volatile 变量缓存无效。 volatile 会禁止指令重排 重排序需要遵守的规则: 重排序不会对存在数据依赖关系的 阅读全文
posted @ 2024-07-19 12:41 _Sylvan 阅读(44) 评论(0) 推荐(0)
摘要: Java 内存模型 Java 内存模型(Java Memory Model,JMM)定义了 Java 程序中的变量、线程如何和主存以及工作内存进行交互的规则。它主要涉及到多线程环境下的共享变量可见性、指令重排等问题,是理解并发编程中的关键概念。 两种并发模型: 如何通信 如何同步 消息传递并发模型 阅读全文
posted @ 2024-07-18 23:08 _Sylvan 阅读(38) 评论(0) 推荐(0)
摘要: 线程组 每个 Thread 必然存在于一个 ThreadGroup 中,Thread 不能独立于 ThreadGroup 存在。执行main()方法的线程名字是 main,如果在 new Thread 时没有显式指定,那么默认将父线程的线程组设置为自己的线程组。 public static void 阅读全文
posted @ 2024-07-18 20:49 _Sylvan 阅读(37) 评论(0) 推荐(0)
摘要: OS 中的进程/线程状态 操作系统中的进程/线程状态转换图: Java 线程的六个状态: // Thread.State 源码 public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; } NEW 阅读全文
posted @ 2024-07-18 20:11 _Sylvan 阅读(141) 评论(0) 推荐(0)
摘要: 无返回值的 Runnable public interface Runnable { public abstract void run(); } public static void main(String[] args) throws ExecutionException, Interrupted 阅读全文
posted @ 2024-07-18 19:34 _Sylvan 阅读(64) 评论(0) 推荐(0)
摘要: 创建线程的三种方式 继承Thread类 class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(getName() + " " + 阅读全文
posted @ 2024-07-18 18:41 _Sylvan 阅读(29) 评论(0) 推荐(0)
上一页 1 ··· 19 20 21 22 23 24 25 26 27 ··· 33 下一页