blog
blog copied to clipboard
个人博客,记录个人总结(见issues)
# 引言 说到Thread大家都很熟悉,我们平常写并发代码的时候都会接触到,那么我们来看看下面这段代码是如何初始化以及执行的呢? ```java public class ThreadDemo { public static void main(String[] args) { new Thread().start(); } } ``` ## 初始化流程 代码就一行很简单,那么这行简单的代码背后做了那些事情呢? ### 初始化Thread这个类 首先JVM会去加载Thread的字节码,初始化这个类,这里即调用下面这段代码: ```java public class Thread implements...
# 引言 > 前段时间遇到一个类似导出数据场景,观察下来发现速度会越来越慢,导出100万数据需要耗费40-60分钟,从日志观察发现,耗时也是越来越高。 # 原因 从代码逻辑上看,这里采取了分批次导出的方式,类似前端的分页,具体是通过skip+limit的方式实现的,那么采用这种方式会有什么问题呢?我们google一下这两个接口的文档: ``` The cursor.skip() method is often expensive because it requires the server to walk from the beginning of the collection or index to...
> CopyOnWriteArrayList是由Doug Lea在JDK1.5引入的一个并发工具类,CopyOnWriteArrayList其实线程安全的ArrayList,但又有点不一样 和HashMap和ConcurrentHashMap的关系有点类似。所有的修改操作(add/set等)都会将底层依赖的数组拷贝一份并在其之上修改,但是我们知道数组的拷贝是一个比较耗时的操作,因此通常用于读多写少的场景下,例如随机访问、遍历等。 ## 工作原理 首先CopyOnWriteArrayList有哪些重要的域, 首先有个可重入锁用于修改(add/set等)时保证其线程安全型,另外有一个array数组用于存储实际的数据,并用volatile修饰,保证可见性。 ```java final transient ReentrantLock lock = new ReentrantLock(); private transient volatile Object[] array; final Object[] getArray() { return array; } final void...
# 问题 今天遇到一个小问题,在进行表单提交之后,直接进入了400错误页面,这个比较诡异,我所做的无非就是进行了简单的参数验证,提取BindingResult中的信息放到Model中方便前台显示,如下: ```java @RequestMapping(value = "/user/publish",method = RequestMethod.POST) String publish(@Valid TopicForm topicForm,Model model,BindingResult result){ if(result.hasErrors()){ model.addAttribute("errors",result.allErrors) return "/user/publish" } Set tagSet = tagService.constructeTags(topicForm.tags) topicService.publish(topicForm.build(tagSet)) return "redirect:/" } ``` #...