ThreadLocal
ThreadLocal 是 Java 中提供的一种用于实现线程局部变量的工具类。它允许每个线程都拥有自己的独立副本,从而实现线程隔离,用于解决多线程中共享对象的线程安全问题。 通常,我们会使用 synchronzed 关键字 或者 lock 来控制线程对临界区资源的同步顺序,但这种加锁的方式会让未获取到锁的线程进行阻塞,很显然,这种方式的时间效率不会特别高。 线程安全问题的核心在于多个线...
ThreadLocal 是 Java 中提供的一种用于实现线程局部变量的工具类。它允许每个线程都拥有自己的独立副本,从而实现线程隔离,用于解决多线程中共享对象的线程安全问题。 通常,我们会使用 synchronzed 关键字 或者 lock 来控制线程对临界区资源的同步顺序,但这种加锁的方式会让未获取到锁的线程进行阻塞,很显然,这种方式的时间效率不会特别高。 线程安全问题的核心在于多个线...
Unsafe 基础 Unsafe 是 Java 中一个非常特殊的类,它为 Java 提供了一种底层、”不安全”的机制来直接访问和操作内存、线程和对象。正如其名字所暗示的,Unsafe 提供了许多不安全的操作,因此它的使用应该非常小心,并限于那些确实需要使用这些底层操作的场景。 Unsafe 在 static 静态代码块中,以单例的方式初始化了一个 Unsafe 对象: public...
原子操作的基本数据类型 基本类型的原子操作主要有这些: AtomicBoolean:以原子更新的方式更新 boolean; AtomicInteger:以原子更新的方式更新 Integer; AtomicLong:以原子更新的方式更新 Long; 这几个类的用法基本一致,这里以 AtomicInteger 为例。 addAndGet(int delta) :...
BlockingQueue 是 Java 中的一个接口,它代表了一个==线程安全==的队列,不仅可以由多个线程并发访问,还添加了==等待/通知机制==,以便在队列为空时阻塞获取元素的线程,直到队列变得可用,或者在队列满时阻塞插入元素的线程,直到队列变得可用。 最常见的”生产者-消费者”问题中,队列通常被视作线程间的数据容器,生产者将“生产”出来的数据放入数据容器,消费者从“数据容器”中获取...
使用线程池的好处 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 线程池的构造方法 public ThreadPoolExecutor(in...
Condition 接口一共提供了以下 7 个方法: await():线程等待直到被通知或者中断。类似于 Object.wait()。 awaitUninterruptibly():线程等待直到被通知,即使在等待时被中断也不会返回。没有与之对应的 Object 方法。 await(long time, TimeUnit unit):线程等待指定的时间,或被通知,或被中断。类似...
ReentrantReadWriteLock 是 Java 的一种读写锁,它允许多个读线程同时访问,但只允许一个写线程访问(会阻塞所有的读写线程)。这种锁的设计可以提高性能,特别是在读操作的数量远远超过写操作的情况下。 在并发场景中,为了解决线程安全问题,我们通常会使用关键字 synchronized 或者 JUC 包中实现了 Lock 接口的 ReentrantLock。但它们都是独占式...
ReentrantLock 重入锁,是实现Lock 接口 的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源重复加锁,即当前线程获取该锁后再次获取不会被阻塞。 要想支持重入性,就要解决两个问题: 在线程获取锁的时候,如果已经获取锁的线程是当前线程的话则直接再次获取成功; 由于锁会被获取 n 次,那么只有锁在被释放同样的 n 次之后,该锁才算是完全释放...
锁的分类 乐观锁、悲观锁 对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java 中,synchronized 关键字是最典型的悲观锁。 乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会加锁,只是在更新数据的时候会去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当...
linux 下预构建二进制文件安装 Nodejs Nodejs预购建二级制文件下载地址 安装 Nodejs 和 npm # 解压 tar xvf node-v20.15.1-linux-x64.tar.xz # 移动解压出的文件夹到 /usr/local下,并且重命名为nodejs mv ./node-v20.15.1-linux-x64 /usr/local/nodejs #...