notes
注解@JsonIgnore的使用方法及其效果
使用方法:一般标记在属性或者方法上,返回的json数据即不包含该属性。
@JsonIgnore
@Column(name = "hobbies")
private String hobbies;
注解@JsonProperty的使用方法及其效果
@JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称
@JsonProperty("rid")
@Column(name = "dealerscode")
private int code;
注解@Builder的使用方法及其效果
@Builder声明实体,表示可以进行Builder方式初始化
UserInfo userInfo = userInfo.toBuilder()
.name("OK")
.email("zgood@sina.com")
.build();
配合这两注解一起使用
@NoArgsConstructor
可以 new 对象或者说有初始构造函数
@AllArgsConstructor
不会出现bug 参数列表和形式参数列表长度不同
注解@Primary可以标记哪个bean是默认使用的,也就是说是@Autowired自动导入的bean
AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference。主要用于在高并发环境下的高效程序处理,来帮助我们简化同步处理.原子性操作
public final int get() //获取当前的值
public final int getAndSet(int newValue)//获取当前的值,并设置新的值
public final int getAndIncrement()//获取当前的值,并自增
public final int getAndDecrement() //获取当前的值,并自减
public final int getAndAdd(int delta) //获取当前的值,并加上预期的值
//使用原子操作值增长时比使用 ReentrantLock 效率更高 但是如果把值从0循环加1到1亿时 比加锁占用资源更多
公平锁 如果获取锁成功则堵塞,后续排队获取
非公平锁 无视队列直接尝试获取锁
即便是公平锁,如果通过不带超时时间限制的tryLock()的方式获取锁的话,它也是不公平的,因为其内部调用的是sync.nonfairTryAcquire()方法,无论抢到与否,都会同步返回。
java内置锁
synchronized
特点:简单
显式锁
ReentrantLock
特点:可重入、可中断、可限时、公平锁
使用显式锁一定要手动释放,如果获取锁后由于异常的原因没有释放锁,那么这把锁将永远得不到释放!所以要将unlock()放在finally块
Future
Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。
cancel方法用来取消任务
isDone方法表示任务是否已经完成,若任务完成,则返回true;
...
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(8); //线程池大小
scheduler.setAwaitTerminationSeconds(5);
scheduler.initialize();
Future gameFlowFuture = scheduler.submit(() -> {
try {
waitBetting();
Thread.sleep(2000);
deal();
Thread.sleep(1000);
doBeforeRoundEnd();
} catch (InterruptedException e) {
log.error(ExceptionUtils.getStackTrace(e));
}
});
Java 双冒号用法
java.util.List<String> list = new ArrayList<String>();
list.add("121");
list.add("231");
for (String n : list) {
System.out.println(n);
}
list.forEach(n -> System.out.println(n));
list.forEach(System.out::println);
//调用方法
for(GameListener onRoundEnd : gameListeners){
scheduler.execute(new Runnable() {
@Override
public void run() {
onRoundEnd.onRoundEnd();
}
});
}
gameListeners.forEach(gameListener -> scheduler.execute(gameListener::onRoundEnd));
JAVA 函数式编程
传统方式
new Thread(new Runnable() {
public void run() {
System.out.println("Hello World!");
}
}).start();
函数
new Thread(() -> System.out.println("Hello World!")).start();
多线程简洁语法
//开启8个线程 使用线程池
List<Integer> testList = Arrays.asList(1,2,3,4,1,2,3,4);
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(8);
scheduler.setAwaitTerminationSeconds(60);
scheduler.initialize();
final AtomicInteger testNum = new AtomicInteger(0);
testList.forEach(b -> scheduler.execute(() -> {
try {
for(int k=0;k<1000;k++){
testNum.addAndGet(1);
}
System.out.println(Thread.currentThread().getName() + " ms:" + System.currentTimeMillis() + " num:" + testNum.get());
} catch (Exception e) {
e.printStackTrace();
}
}));
//显式创建
final AtomicInteger testNum = new AtomicInteger(0);
for (int i = 0; i < 8; i++) {
new Thread(() -> {
try {
for (int k = 0; k < 1000; k++) {
testNum.addAndGet(1);
}
System.out.println(Thread.currentThread().getName() + " ms:" + System.currentTimeMillis() + " num:" + testNum.get());
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
结束当前正在运行中的java虚拟机
System.exit(0)是将你的整个虚拟机里的内容都停掉了,无论如何,内存都释放了!也就是说连JVM都关闭了,内存里根本不可能还有什么东西
System.exit(0)是正常退出程序,而System.exit(1)或者说非0表示非正常退出程序
Idea 修改 Git userName
idea中git工具的用户名修改
在 Terminal 中输入git config user.name获取当前的用户名
修改用户名输入git config --global user.name 用户名
完成修改
java 8 Optional返回筛选后的值 or 对象
List<String> mapperList = new ArrayList<>();
mapperList.add("baccarat");
mapperList.add("dragontiger");
mapperList.add("fantan");
String sd = mapperList.stream()
.filter("fantan"::equals)
.findFirst()
.orElseGet(String::new);
or 对象
.get()
Base64 加解密
//转码
System.out.println(new sun.misc.BASE64Encoder().encode("666666".getBytes()));
//解码
BASE64Decoder decoder = new BASE64Decoder();
System.out.println(new String(decoder.decodeBuffer("NjY2NjY2")));
网友评论