AtomicInteger的updateAndGet是线程不安全的 可以看得出来,有一些方法重复打印了,说明integer.updateAndGet()这个方法被重复调用了。如果说integer.updateAndGet()这个方法传入的是一个外部方法,比如数据库入库操作并返回行数,就会出现线程不安全问题了,数据会重复插入。这是因为这个方法在多线程环境下,尝试更新值失败时,方法会被重新调用,导致重复执行。因此传入的外部方法不能对外部结果产生副作用,比如入库操作之类。
/root/jdk-11.0.19 is not a directory on the Jenkins controller (but perhaps it exists on some agents 直接2行命令搞定,先给jenkins权限,再复制到/var/lib/jenkins目录下就可以了。不知道为什么网上写的那么复杂。
关于volatile指令防止重排序,指令重排序可能产生的问题用图详解 在java中,大家都会接触到指令重排序这个概念,在创建懒汉单例模式的时候都知道要加个volatile,可以解决重排序问题,但是刚开始我却发现很难理解指令重排序,不知道创建单例模式如果重排序会有什么问题。直到今天算是又进一步理解了,所以赶紧做了笔记,画了图分享给大家看看。单例模式中如果不加volatile有可能出现指令重排序,比如:private static ObjInstance instance;//线程1if(instance!=null){ instance.method();}
分享一个用Java写的红包抽奖方法 希望有人喜欢,哈哈import java.math.BigDecimal;import java.util.*;/** * 抽奖 * * @author Administrator */public class Lottery { private static String lottery(Map<String, Double> map) { TreeMap<Double, String> weightMap = new TreeMap&l
5个空瓶可以换1瓶汽水,某班同学喝了161瓶汽水,其中有一些是用喝剩下来的空瓶换的,那么他们至少要买汽水多少瓶? 5个空瓶可以换1瓶汽水,某班同学喝了161瓶汽水,其中有一些是用喝剩下来的空瓶换的,那么他们至少要买汽水多少瓶?let target=161let a = 1let b = 1let c = 1while(a<target){ a*=5 b*=(1/5) c+=b}let total = Math.ceil(target/c)console.log("需要买的瓶数为:"+total)每5个瓶子可以换1瓶=每1个瓶子可以换0.2瓶每0.2个瓶子可以换0.04个瓶子
多线程读写大文件,为大文件上传做准备 原理:比如有个1000字节的文件,使用5个线程进行拷贝,那么每个线程处理200个字节。第一个线程从0坐标读取200个字节。第二个线程从200坐标读取200个字节,以此类推。然后第一个从0坐标写入200个字节,第二个线程从200坐标写入200个字节,以此类推。使用RandomAccessFile可以帮我们实现这个功能。代码如下:package com.yang.main;import java.io.File;import java.io.IOException;import java.io.
try,catch,finally执行顺序 public static void main(String[] args) { int test = test(); System.out.println("test = " + test); } public static int test(){ try { int i =1/0; return i; } catch (Exception e) { .
canal_adapter1.1.5将mysql数据同步至elasticsearch7,可以少走一些坑 几天前,canal发布了1.1.5版本,通过该版本可以将mysql热迁移到es7,1.1.5之前的版本是不支持es7的。官方地址1.下载,canal-1.1.5,下载下面几个:2.配置mysql和deployer,参考文档https://github.com/alibaba/canal/wiki/QuickStart3.配置adapter,参考文档https://github.com/alibaba/canal/wiki/ClientAdapter和https://github.com/aliba
java根据正则表达式查询字符串 private static final Pattern PATTERN = Pattern.compile("/\\d+");public static void main(String[] args) { String url = "/6850383508626078/333433"; Matcher matcher = SITE_ID_PATTERN.matcher(url); while (matcher.find()){ S
ES的SQL查询,分页问题 不能随机分页,但是可以像scroll一样深度分页POST /_sql?format=json{ "query": "select * from user", "fetch_size": 5}返回结果会包括一个cursor字段,可以用这个字段进行深度分页POST /_sql?format=json{ "cursor": "..."}当返回值不再有cursor字段时,说明到最后一页如果未到最后一页,结束查询,需要关闭cursor,节约资源POST /_sql/close{
驼峰转下划线,下划线转驼峰和JSON字符串key键下划线转驼峰 下划线转驼峰private static Pattern linePattern = Pattern.compile("[_]\\w");/** * 下划线转驼峰 * @param str * @return */ public static String lineToHump(String str) { Matcher matcher = linePattern.matcher(str); StringBuffer sb