KANG's BLOG

Let's have some fun

Java中两把锁:ReentrantLock和synchronized

Reentrantlock类 重入锁代表一段代码可以被同一个线程多次进入,其中unlock()次数对应lock()的次数。 区别于jvm实现的synchronized关键字,ReentrantLock是Lock的实现,代码层级的锁,常在finally中调用unlock()释放锁,所以在程序崩溃情况下,有可能造成死锁。 //创建一个非公平锁,默认是非公平锁 Lock nonFairLock= new ReentrantLock(); Lock nonFairLock= new ReentrantLock(false); //创建一个公平锁,构造传参true Lock fairLock= new ReentrantLock(true); 公平锁 & 非公平锁 公平锁 加锁前先查看是否有排队等待的线程,有的话优先处理排在前面的线程,先来先得。

Java中的new关键字

new关键字在生成对象时完成了三件事情: 为对象开辟内存空间。 调用类的构造方法。 将生成的对象的地址返回。 在并发环境下从堆中划分内存空间是非线程安全的 new是原子性操作 new运算符具有数据操作的原子性 也就是说创建一个Java对象分配内存,要么所有步骤都成功,返回对象的引用,要么回归到创建之前的内存状态,返回为NULL。

Java中的多线程

1. 线程状态 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。 RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的成为“运行”。 线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得cpu 时间片后变为运行中状态(running)。 阻塞(BLOCKED):表线程阻塞于锁。 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。 超时等待(TIME_WAITING):该状态不同于WAITING,它可以在指定的时间内自行返回。 终止(TERMINATED):表示该线程已经执行完毕。 2.

Java线程池原理

一、线城池处理任务的优先级 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。 如果此时线程池中的数量等于corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。 核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。 二、Handler拒绝策略 ThreadPoolExecutor.AbortPolicy() 抛出java.

MapStruct - Java对象转换器

如何干掉BeanUtils? 写业务代码时,为了保证service的复用和逻辑关系,我们通常需要保持良好的分层结构,比如controller -> service -> dao,职责分明,复用性强,但是带来的问题就是频繁的对象转换。 有一种方式就是每两个对象的转化都编写对应的converter方法,方法内部直接新建对象并为其赋值。这样做最大问题就是代码量骤增,虽然我们可以放在assembler中保持service代码干净,但依旧避免不了开发成本高的问题,而且后期DO变化时,项目中所有的converter都需要修改。 还有一种解决方案是BeanUtils的对象复制功能,但它是在运行期通过反射做的对象转换,性能非常差。 有没有一种方法在编译器动态进行对象转化呢? MapStruct介绍 MapStruct是一个在编译器进行代码增强来帮你进行对象转换的工具。

volatile关键字详解

作用 一个被volatile声明的变量主要有以下两种特性保证保证线程安全 可见性 将当前处理器缓存行的数据会写回到系统内存。 这个写回内存的操作会引起在其他CPU里缓存了该内存地址的数据无效 有序性 虚拟机在进行代码编译优化的时候,对于那些改变顺序之后不会对最终变量的值造成影响的代码,volatile可防止编译器将他们进行重排序。 int a = 10; int b = 5; 原理 被volatile关键字修饰的变量会存在一个"lock:“的前缀

用Java写一个死锁

public class LeftRightDeadlock { private final Object left = new Object(); private final Object right = new Object(); public void leftRight() { // 得到left锁 synchronized (left) { // 得到right锁 synchronized (right) { doSomething(); } } } public void rightLeft() { // 得到right锁 synchronized (right) { // 得到left锁 synchronized (left) { doSomethingElse(); } } } }