
线程安全
文章平均质量分 54
多线程并发安全相关问题记录
shy_snow
这个作者很懒,什么都没留下…
展开
-
mysql锁表定位
select s.*,hw.* from (select curtime() curtime, h.trx_mysql_thread_id holder, timestampdiff(second, h.trx_started, now()) elap_sec, rpad(ifnull(h.trx_query, 'null'), 50, ' ') sqltext, group_concat(w.trx_mysql_thread_i...原创 2022-02-03 10:34:26 · 309 阅读 · 0 评论 -
insert into select 死锁
show engine innodb status;发现有死锁, insert into b select * from s where ;我们是mysql数据库,可重复读隔离级别, 在insert into b select * from s where 这种语句下会对表b加X锁,对s表扫描的行加S共享读锁。原创 2021-08-15 09:17:40 · 1644 阅读 · 0 评论 -
启动多个线程后同时并行执行程序
利用CyclicBarrier类可以实现一组线程相互等待,当所有线程都到达某个屏障点后再进行后续的操作。import java.util.concurrent.CyclicBarrier;/** * @author zxc * 启动threadSize个线程后同时并行执行程序 */public class CycSleepTest{ public static void main(String[] args) throws Exception {原创 2021-06-15 10:14:23 · 495 阅读 · 0 评论 -
quartz集群重复调度的解决
https://segmentfault.com/a/1190000015492260#quartz在触发时是乐观锁存在ABA问题,在配置文件加上org.quartz.jobStore.acquireTriggersWithinLock=true,这样,在拉取待即将触发的triggers时,是上锁的状态,不会同时存在多个线程拉取到相同的trigger的情况,避免了复调度的危险。...原创 2021-02-03 17:09:00 · 1673 阅读 · 0 评论 -
使用静态容器防止并发修改同一对象
/** * 同时保存一个对象,需要有一个等待或退出 */ public static final long SAVE_OBJ_ERROR_CODE_WAIT = -9L; /** * 保存正在保存的对象Id,保存完成后remove,如果保存前发现有相同Id的对象在该map中则说明上一次保存还未结束或有其他人正在修改同一对象,需要等待其完成后才继续操作 */ private static final Map idMap = new ConcurrentHashMap();...原创 2020-07-11 03:37:58 · 215 阅读 · 0 评论 -
无法执行任何java命令,报错OutOfMemoryError: Cannot create GC thread. Out of system resources
生产程序功能不执行了,远程定位时发现无法使用jps,jstack甚至java -version命令,所有的java命令都无法执行,报错为无法创建线程.$jps -mlError occurred during initialization of VMCannot create VM thread. Out of system resources.查看程序日志发现有unable to create new native thread类似无法创建线程的报错内存及CPU空闲较多,资源充足排除内存不..原创 2020-06-16 13:50:39 · 2876 阅读 · 0 评论 -
多线程安全小结-可见性(内存屏障,共享变量副本)、原子性、有序性(编译器优化、cpu流水线乱序)
摘要:java多线程安全要满足:原子性、可见性、有序性。手段有:不共享;不可变状态对象;互斥锁;同步工具类;线程安全工具类本文为本人阅读《Java并发编程实战》的理解和总结,java多线程安全性基础介绍.pptx多线程知识前提 什么是线程 线程 任务(调度运行,run()代码执行)和资源(cpu时间,内存)的抽象 线程是CPU调度的基本单位 实...原创 2018-10-17 18:43:20 · 646 阅读 · 0 评论 -
显式锁示例
tryLock在一定时间内获取不到锁不会一直阻塞,会返回false,然后线程会继续向下走。package com.iteye.yuanyuan7891.thread.lock;import java.util.Date;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Lock;import...原创 2018-09-13 16:25:52 · 212 阅读 · 0 评论 -
一次java线程死锁的定位
ETL流程卡死原因定位一、现象:模板大量并发执行流程,经常流程节点脚本运行完成之后,卡死,不更新状态,不继续往下执行。查看日志未发现任何异常信息。二、定位。jps -ml查看进程号pid,然后jstack -l pid输出线程dump文件,分析发现有死锁。经过分析为模板并发流程更新节点状态与流程保存日志方法调用数据库连接时的死锁。查看这两个线程的堆栈在哪个方法,以及各自持有的锁...原创 2018-12-23 00:46:55 · 535 阅读 · 0 评论 -
使用ThreadLocal和AtomicInteger将int属性改为线程安全的计数器
项目有个单例对象内部有个int属性作为计数器,之前的同事可能没有考虑到多线程安全问题,在多线程环境下该int属性的值完全乱了;但是该单例类已经到处使用了,代码不好动,只好使用ThreadLocal来修改了。ThreadLocal是每个线程有一份独立的数据,也就不会有多线程并发的问题了。首先是定义,如果当前线程没有初始化该值就会执行里面的initialValue(): privat...原创 2019-07-02 17:47:25 · 1547 阅读 · 0 评论