全栈工程师
JVM 内存溢出会抛出 java.lang.OutOfMemoryError异常。让我们来聊聊OOM 原因及其解决方法。 1. Java heap space 当堆内存(Heap Space)没有足够空间存放新创建的对象时,就会抛出 java.lang.OutOfMe...
全栈工程师
假设你要关闭运行中的应用程序。比方说,在微服务架构中,你有多个微服务应用的实例运 行在云上,其中某个实例有问题了,你决定关闭该实例并让云服务提供商为你重启这个有问题的 应用程序。在这个场景中,Actuator的/shutdown端点就很有用了。 为了关闭应用程序,你要往/shutdow...
全栈工程师
说说 Spring AOP 面向切面编程,在我们的应用中,经常需要做一些事情,但是这些事情与核心业务无 关,比如,要记录所有 update*方法的执行时间时间,操作人等等信息,记录到日志,通过 spring 的 AOP 技术,就可以在不修改 update*的代码的情况下完成该需求。&nbs...
全栈工程师
sleep源码如下: public class Thread implements Runnable { public static native void sleep(long millis) throws InterruptedException; public s...
全栈工程师
使用 redis 或 memcached 之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。对于 redis 和 memcached我认为有如下区别:1.redis支持更丰富的数据类型(支持更复杂的应用场景):Redis不仅仅支持简单的k/v类型的数据,同时还提供 li...
全栈工程师
前几天我在想,哪一个是最重要的Java API。SE和EE API中的哪一个实现了Java生态系统的大部分框架、功能,而这不可能只是作为第三方库重新创建的。正如您可能已经通过标题猜到了,我认为是反射API。是的,它不可避免地、直接或间接的成为每个项目的一部分。但对于更多的API来说,这是正确的,特别...
全栈工程师
Apache Shiro是Java的一个安全框架。目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的Shiro就足够了。对于它俩到底哪个...
全栈工程师
通过Java代码实现IP地址所在区域等信息获取是很难实现的,我们需要强大的IP库支持。好在淘宝提供了公益开源的IP信息获取接口,让我们能够轻松实现IP地址的具体信息的获取。(PS:淘宝提供的IP Url有每日调用次数限制,对于访问量大的网站可能要考虑缓存IP信息到本地库,减少对该Url的调用次数)。...
全栈工程师
在一些Java项目中,我们希望根据中文名称自动生成一串拼音代号,那么我们该如何实现呢?自己写代码实现类似功能还是比较麻烦的,我们可以使用开源的此类工具包pinyin4j来实现。 首先,引入pinyin4j依赖包: <dependency> <groupId...
全栈工程师
在很多项目中,我们都会用到Cookie来读取一些会话等信息。例如登录、用户识别、防重复点击等。那么,如何用java实现对Cookie的简单管理呢? 一个完善的Java工具类实现Cookie的获取、移除、写入:package com.my.common.utils; import java.io...
全栈工程师
Mockito是常用的写单元测试覆盖率的框架之一。在有的业务服务中,使用了多线程,这时候我们如何mock多线程呢?其实很简单,通过ReflectionTestUtils手动setter多线程实例即可。代码如下:import org.junit.Before; import org.junit.Te...
全栈工程师
一、高并发下的问题A、B两个商品各有若干库存,如何在高并发下保证商品库存的安全性?1)库存是否存在多扣?2)库存是否存在少扣?3)扣库存的时候是否存在死锁?二、 下单的步骤(1)下单(2)下单同时预占库存(3)支付(4)发货真正减扣库存(5)取消订单(6)回退预占库存三、 重复下单问题(1)用户点击...
全栈工程师
1)它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java 组件.并且和 Spring 提供的其他基础结构紧密集成.    2)不依赖于 Servlet API(目标虽是如此,但是在实现的时候确实是依赖于 Servlet 的)  ...
全栈工程师
下面列举了一些使用 Spring 框架带来的主要好处:1) Dependency  Injection(DI)  方法使得构造器和 JavaBean properties 文件中的依赖关系一目了然。2) 与 EJB 容器相比较,IoC 容器更加趋向于轻量级。这样一来IoC 容器在...
全栈工程师
笔者收集到的区别如下:在 FileSystemResource 中需要给出 spring-config.xml 文件在你项目中的相对路径或者 绝对路径。在 ClassPathResource 中 spring 会在 ClassPath 中自动搜寻配置文件,所以要把 ClassPathResource...
全栈工程师
通过学习,了解到以下4种特殊情况下,finally块不会被执行:1. 在finally语句块中发生了异常。 2. 在前面的代码中用了System.exit()退出程序。 3. 程序所在的线程死亡。 4. 关闭CPU。 ...
全栈工程师
方法1:通过 ScannerScanner input = new Scanner(System.in); String s = input.nextLine(); input.close();方法2:通过 BufferedReaderBufferedReader input = new B...
全栈工程师
Synchronized显然是一个悲观锁,因为它的并发策略是悲观的:不管是否会产生竞争,任何的数据操作都必须要加锁、用户态核心态转换、维护锁计数器和检查是否有被阻塞的线程需要被唤醒等操作。随着硬件指令集的发展,我们可以使用基于冲突检测的乐观并发策略。先进行操作,如果没有其他线程征用数据,那操作就成功...
全栈工程师
其实,锁的实现原理基本是为了达到一个目的:让所有的线程都能看到某种标记。Synchronized通过在对象头中设置标记实现了这一目的,是一种JVM原生的锁实现方式,而ReentrantLock以及所有的基于Lock接口的实现类,都是通过用一个volitile修饰的int型变量,并保证每个线程都能拥有...
全栈工程师
ReentrantLock是Lock的实现类,是一个互斥的同步锁。从功能角度,ReentrantLock比Synchronized的同步操作更精细(因为可以像普通对象一样使用),甚至实现Synchronized没有的高级功能,如:1)等待可中断:当持有锁的线程长期不释放锁的时候,正在等待的线程可以选...