写在前面volatile两大特性
保证变量的可见性:当一个被volatile关键字修饰的变量被一个线程修改的时候,其他线程可以立刻得到修改之后的结果。当一个线程向被volatile关键字修饰的变量写入数据的时候,虚拟机会强制它被值刷新到主内存中。当一个线程用到被volatile关键字修饰的值的时候,虚拟机会强制要求它从主内存中读取。
屏蔽指令重排序:指令重排序是编译器和处理器为了高效对程序进行优化的手段,它只能保证程序执行的结果时正确的,但是无法保证程序的操作顺序与代码顺序一致。这在单线程中不会构成问题,但是在多线程中就会出现问题。非常经典的例子是在单例方法中同时对字段加入volatil...
写在前面在之前的文章中写到了jvm的垃圾回收器(收集器),所以这里主要是根据实际的小例子来浅析各个垃圾回收器的特点
先贴出本次测试的测试代码
12345678910111213141516171819202122232425262728293031323334package gc;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Random;public class SimpleTest { public...
一个栗子自己前几天接收到一个需求,需求想要实现的功能十分简单:就是在某个表单内增加一个必填的下拉框,以提醒用户不要忘记做某一个动作(也许这就是表单设计太过简易的缺点吧@_@)。然后我就简单写了个功能设计文档,遂安排一名同学去完成这个工作。
第二天我去查看完成效果,这位同学笑嘻嘻的说这么简单的功能我已经开发、自测完毕了,准备测试和上线了。我很满意,让他给我演示了下。嗯。不错。
准备部署测试环境,突然发现他在confluence上传了份DB,我惊了,打开一看,DDL脚本在业务数据表内也新增了一个字段用来保存新增的下拉框用户所选的值。这个DDL完全是画蛇添足,造成的影响就是:原来仅仅只是修改前...
想起之前研究java的nio时候,发现自己大学时用的socket在nio上有一个实现:SocketChannel,所以很感兴趣的一边学一边尝试,写了个很简单的几百行小程序,模仿现实中的(一server对多client)聊天,话不多说直接上代码和实现效果,可以看到,得力于nio,server程序一个线程就可以同时处理多个client的socket连接
Server.java
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585...
答案当然是会,问题的关键是释放的什么锁呢?,我们先来看看join方法的源码
1234567891011121314151617181920212223242526272829303132//比如我们在thread1(下面简称t1)中调用了thread2(下面简称t2).join()方法,t2.join(0)方法//注意方法被synchronized修饰,所以t1中获取了t2的对象锁public final synchronized void join(long millis) //默认0,不超时 throws InterruptedException { ...
jvm内存结构变化
不变点
1、堆—–堆是所有线程共享的,主要用来存储对象。其中,堆可分为:年轻代和老年代两块区域,
老年代与年轻代比例使用NewRatio参数来设定比例。比如: –XX:NewRatio=2表示新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ,这也是jdk8的默认比例,也就是老年代 ( Old ) = 2/3 的堆空间大小。
对于年轻代,一个Eden区和两个Suvivor区(from,to),使用参数SuvivorRatio来设定大小,比如:
–XX:SurvivorRatio=8表示Edem : from...
众所周知,Spring注入bean时都是将可实例化对象注入。但是我们在写myabtis时却从来没有写过它的mapper实现类,仅仅是写了一个接口就可以在service层使用这个bean,这是为什么呢?我们可以先看下spring最终给我们注入到mapperBean的是什么类呢?
果然,它注入的是mybatis代理类:MapperProxy,那么这个实例是什么时候注入进入bean工厂的呢?我们继续往下看:
找问题从源头找,首先mybatis是怎么知道哪些mapper并且知道去哪里扫描呢?没错就是通过以下三种方式:
12345678//第一种注解方式,如@MapperScan("com.d...
昨天自己负责的一个系统的生产环境出现了一个神奇的BUG:
123456789101112131415161718192021[2019-08-29 19:54:27.819] [ERROR] [org.hibernate.engine.jdbc.batch.internal.BatchingBatch.performExecution(BatchingBatch.java:137)] [qtp1165897474-48619] : HHH000315: Exception executing batch [Batch update returned unexpected row coun...
今天手工重新搭建springboot的时候发现一个以前遗漏的知识点:
Spring Boot 官方默认扫描的包需要和启动类同级,这里就间接体现了springboot约定大于配置的做法,如果我们需要自定义springboot的扫描路径,需要在启动类上加入如下注解:
1@ComponentScan(basePackages = {"项目路径"})
和spring很像哦~
Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive大部分情况下是不支持对数据的改写和添加,日常开发中如果需要真的对数据进行增删改,都可以通过模仿以下方式简单实现
增
1、文件方式增加:
12#OVERWRITE 表示覆盖,不写则是appendLOAD DATA INPATH '/user/upload/3.csv' [OVERWRITE] INTO TABLE ods_sap_hr.bic_a100 PARTITION (inc_month=201907);
2、insert into 方式
12#OVERWRITE 表示覆盖,不写则是appendin...