炎黄伙哥

炎黄伙哥 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

炎黄伙哥 回答了问题 · 3月18日

这句sql会导致并发出问题吗 ?

没有问题,因为update会先用当前读查出要修改的记录,然后再进行修改操作,而当前读是会对这些数据行加排它锁的,所以可以保证并发安全。下面是我写的一个小例子,有兴趣的可以自己实验一下,c1虽然早早就完成了更新,但是必然要等到c1睡眠时间结束后提交事务释放了排它锁,c2才能成功更新,在这之前c2是阻塞等待c1释放排它锁的

public static void main(String[] args) throws ClassNotFoundException, SQLException {

    Class.forName("com.mysql.cj.jdbc.Driver");
    Connection c1 = null;//获取连接1
    Connection c2 = null;//获取连接2
    c1.setAutoCommit(false);
    c2.setAutoCommit(false);
    new Thread() {

        public void run() {
            System.out.println("c1开始更新");
            try {
                PreparedStatement ps = c1.prepareStatement("update test set num = num -1 where id = 1");
                ps.executeUpdate();
                ps.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("c1完成更新");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("c1睡眠结束");
            try {
                c1.commit();
                c1.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }.start();

    new Thread() {

        public void run() {
            System.out.println("进入线程2");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                 e1.printStackTrace();
            }
            System.out.println("c2开始更新");
            try {
                PreparedStatement ps = c2.prepareStatement("update test set num = num -1 where id = 1");
                ps.executeUpdate();
                ps.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                 e.printStackTrace();
            }
            System.out.println("c2完成更新");
            try {
                c2.commit();
                c2.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }.start();
}

关注 6 回答 5

炎黄伙哥 回答了问题 · 1月21日

解决SpringCloud Feign为啥调用不通?

检查一下你的项目里有ribbon的依赖吗

关注 2 回答 1

炎黄伙哥 回答了问题 · 1月6日

怎么能使用注册中心服务发现的同时自己加载本地静态ribbon啊?

只能自定义serverlist实现,可以深入研究一下源码

listOfServers参数生效的代码
org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration#ribbonServerList(IClientConfig config)

eureka生效的代码
org.springframework.cloud.netflix.ribbon.eureka.EurekaRibbonClientConfiguration#ribbonServerList(IClientConfig config, Provider<EurekaClient> eurekaClientProvider)

配置自定义serverlist的参数
xxx.ribbon.NIWSServerListClassName

关注 2 回答 1

炎黄伙哥 回答了问题 · 1月6日

SpringBoot多模块打包,程序包com.abbott.common.controller不存在

把子项目的plugin去掉,否则maven会自动在子项目的类的包名前加上BOOT-INF.classes.,你可以反编译看看是不是

关注 2 回答 1

炎黄伙哥 回答了问题 · 2020-12-26

两个数据量很大的集合求差集的高效方法

首先必须用到的思想肯定是比较,在这个基础上考虑怎么比较。参考数据库左右连接的实现,可以取长度小的集合作为驱动表,然后遍历驱动表中的每个元素去判断在另一个集合中是否存在,而另一个元素则可以使用索引提高查询效率,可以考虑将这个集合转换为HashSet

关注 7 回答 9

炎黄伙哥 赞了回答 · 2020-12-24

为什么线程一可以读到线程二的非volatile值?请大佬指教。

image.png

循环读取volatile 变量 对volatile修饰的变量每次都会从主内存读取
主要是因为 i aa 在同一个缓存行中 每次读取都会附带更新aa
所以 等线程二 更新aa 这个不会立即刷新 主要是后面的println()语句中加锁了 会强制刷新该线程

public void println(boolean x) {
    synchronized (this) { //这里会刷新当前线程工作空间 aa就写到主内存中 然后就读取跳出
        print(x);
 newLine();
 }
}

关注 4 回答 3

炎黄伙哥 回答了问题 · 2020-12-10

java发送post form_data请求

post.setEntity(new StringEntity(data));

关注 3 回答 2

炎黄伙哥 回答了问题 · 2020-12-10

spring boot上传文件时数据流二次读取如何解决啊?

你既然重写了getInputStream,本来就没必要再保留body这个变量了

关注 4 回答 3

炎黄伙哥 回答了问题 · 2020-12-08

自动服务任务用工作流还是用规则引擎?

activiti和drools在很久以前都用过一点,从你描述看应该肯定是activiti了,drools我印象里就是以规则为单位执行的,正常的用法一个规则执行完了就完了,能不能自动调下一个不记得了,但是activiti肯定是没问题的,条件分支啥的应该也是activiti实现起来更容易

关注 2 回答 2

炎黄伙哥 回答了问题 · 2020-12-03

解决用 resttemple 进行http请求,在并发(100)的情况,会出现部分请求在socketread0阻塞

你这okhttp配置有问题吧,你调用链里显示的都是apache httpclient的类啊

关注 3 回答 2

认证与成就

  • 获得 4 次点赞
  • 获得 7 枚徽章 获得 0 枚金徽章, 获得 1 枚银徽章, 获得 6 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2017-05-25
个人主页被 766 人浏览