万字长文:一文详解单元测试干了什么
EasyMock是一套通过简单方法对于给定的接口生成mock对象的类库,通过使用Java代理机制动态生成模拟对象。该框架提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序等,还可以令mock对象返回指定的值或抛出指定异常。开发者通过EasyMock可以方便的构造mock对象而忽略对象背...
Java并发编程之set集合的线程安全类你知道吗
创建set有五种方法,其中通过三个子类直接创建出来的是线程不安全的。想要创建线程安全的set可以通过工具类或者是juc包下相关的类创建。如下图:
Java中23种设计模式的详细解析
存在这样的情况:在Java中创建对象和赋值操作是分开进行的即instance=newSingleton()是分两步执行的JVM并不保证这两个操作的先后顺序:有可能JVM会为新的Singleton实例分配空间,然后直接赋值给instance成员然后再去初始化这个Singleton实例这样就可能会出错示例:A,B两个线程A,B线程同时进入第一个if判断A首先进入synchron...
Java Map中那些巧妙的设计
虽然引入了分段锁的机制,即可以保证线程安全,又可以解决锁粒度过粗导致的性能低下问题,但是对于追求极致性能的工程师来说,这还不是性能的天花板。因此,在JDK1.8中,ConcurrentHashMap摒弃了分段锁,使用了乐观锁的实现方式。放弃分段锁的原因主要有以下几点:使用segment之后,会增加ConcurrentHashMap的存储空间。当单个se...
Spring 的 Controller 是单例还是多例?怎么保证并发的安全?
controller默认是单例的,不要使用非静态的成员变量,否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。我们下面来简单的验证下:packagecom.riemann.springbootdemo.controller;importorg.springframework.context.annotation.Scope;importorg.springframework.stereotype.Controller;importorg.springframework.web...
Java中常用七个阻塞队列的总结
是有界的阻塞安全队列(思考:为什么说是有界的?是怎么保证线程安全的?),默认是不保证线程的公平性(思考:为什么默认不能保证线程公平?如何保证线程安全?),不允许向队列中插入null元素(www.e993.com)2024年11月8日。LBQueue:“有界”的阻塞安全队列,其底层使用的是链表的数据结构。所谓的“有界”是因为,默认队列的大小是Integer.MAX_VALUE。这个...
Java多线程编程:开胃小菜
小A:通过Thread的interrupt()方法,来通知线程停止。然后我们通过isInterrupted()判断是否停止线程,然后使用抛异常的方式停止线程?MDove:没错,但是不止抛异常,return,break都可以满足这个要求。小A:OK,停止线程我明白了,我记得上篇文章,你用了大量的篇幅去聊线程安全的问题,那么在代码中,我们应该怎么做呢?...
ConcurrentHashMap真的线程安全吗?
我们都知道ConcurrentHashMap是个线程安全的哈希表容器,但它仅保证提供的原子性读写操作线程安全。1、案例有个含900个元素的Map,现在再补充100个元素进去,这个补充操作由10个线程并发进行。开发人员误以为使用ConcurrentHashMap就不会有线程安全问题,于是不加思索地写出了下面的代码:在每一个线程的代码逻辑中先通过...
内存泄露的原因找到了,罪魁祸首居然是Java TheadLocal
创建一个核心线程数和最大线程数都为10的线程池,保证线程池里一直会有10个线程在运行。使用for循环向线程池中提交了100个任务。定义了一个ThreadLocal类型的变量,Value类型是大对象。每个任务会向threadLocal变量里塞一个大对象,然后执行其他业务逻辑。