Hibernate: 如何原生查询的控制缓存无效
问题描述:“有人告诉我,原生查询会从我的二级缓存中删除所有实体。但你仍然在推荐他们。它们不会对性能产生负面影响吗?”方案:是的,有些原生查询会使二级缓存失效。但是不用担心,如果你做得正确,它不会对性能产生任何负面影响,也不会改变我对于使用原生查询的建议。我们首先需要讨论哪种原生查询会使二级缓存失效。哪些原生查...
Java ExecutorService 指南
ExecutorService 是一个 JDK API,它简化了在异步模式下运行任务。一般来说,ExecutorService 自动提供一个线程池和一个 API,用于向其分配任务。创建 ExecutorService 最简单的方法是使用 Executors 类的工...
Java 并发面试题及答案
Java 中的并发是在技术面试中提出的最复杂和最高级的主题之一。这篇文章提供了你可能遇到的一些面试问题的答案。Q1. 进程和线程的区别进程和线程都是并发单元,但它们有一个根本的区别:进程不共享公共内存,而线程共享。从操作系统的角度来看,进程是在自己的虚拟内存空间中运行的独立软件。任何多任务操作系统(几乎所有现代操作系统)都必须在内存中分离进程,这样...
OpenJDK 的 Loom 项目
本文中,我们将快速了解 Loom 项目。从本质上讲,Loom 项目的主要目标是支持 Java 中的高吞吐量、轻量级并发模型。Loom 项目是 OpenJDK 社区为 Java 引入轻量级并发结构的一次尝试。到目前为止,Loom 的原型已经在 JVM 和 Java 库中引入了一次更改。虽然 Loom 还没有计划发布,但我们可以在 ...
推荐的 Spring Boot 项目的包结构
在构建一个新的 Spring Boot 项目时,我们可以高度灵活地组织我们的类。不过,还是有一些建议需要我们牢记。鉴于像 @ComponentScan、@EntityScan、@ConfigurationPropertiesScan 和 @SpringBootApplication 这样的 Spring Boot 注解使用包来定义扫描位置,...
JAVA 阻塞队列 java.util.concurrent.BlockingQueue 指南
本文中,我们将研究解决并发生产者-消费者问题的最有用的构造之一 java.util.concurrent。我们将研究 BlockingQueue 接口的 API,以及来自该接口的方法如何使编写并发程序变得更容易。在本文的后面,我们将展示一个简单程序的示例,该程序具有多个生产者线程和多个消费者线程。我们可以区分两...
Java Phaser 指南
本文中,我们将研究 java.util.concurrent 包中的 Phaser 构造。它是一个与 CountDownLatch 非常相似的结构,允许我们协调线程的执行。与 CountDownLatch 相比,它有一些额外的功能。Phaser 是一个屏障(barrier),在继续执行之前,动态数量的线程需要等待它。在 CountDow...
如何在 Java 中编写 equals 等价方法
本文描述了一种重写 equals 方法的技术,该方法即使在具体类的子类添加新字段时也能保留 equals 的约定。子类化时保留 equals contract 的是“面向对象语言中等价关系的基本问题”。除非你愿意放弃面向对象抽象的好处,否则无法在保留 equals 契约的同时扩展可实例化类并添加值组件。...
JAVA 高并发之 java.util.concurrent 概述
java.util.concurrent 包为创建高并发应用提供了工具。本文将对此包做一个概述。java.util.concurrent 包含了太多的功能,无法在一篇文章中进行讨论。本文中,我们将主要关注此包中一些最有用的实用功能,如:Executor、ExecutorService、ScheduledExecutorService、...
Java 中的 CountDownLatch 指南
本文中,我们将提供 CountDownLatch 类的指南,并演示如何在几个实际示例中使用它。本质上,通过使用 CountDownLatch,我们可以让线程阻塞,直到其他线程完成给定的任务。简单地说,CountDownLatch 有一个计数器(counter)字段,你可以根据需要递减。然后我们可以使用它来阻塞调用线程,直到它被...