减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程。 无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。 CAS算法:Java的Atomic包使用CAS算法来更新数 ...
分类:
其他好文 时间:
2019-09-06 00:57:22
阅读次数:
121
前言 CAS,即 Compare And Swap(比较与交换),是一种无锁算法,基于硬件原语实现,能够在不使用锁的情况下实现多线程之间的变量同步。jdk中的java.util.concurrent.atomic包中的原子类就是通过CAS来实现了乐观锁。 CAS算法过程 算法涉及到三个操作数: 需要 ...
分类:
编程语言 时间:
2019-09-03 22:39:46
阅读次数:
118
CAS (compareAndSwap),中文叫比较交换,一种无锁原子算法。 过程是这样:它包含 3 个参数 CAS(V,E,N),V表示要更新变量的值,E表示预期值,N表示新值。仅当 V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做两个更新,则当前线程则什么都不做。最 ...
分类:
其他好文 时间:
2019-08-29 09:54:32
阅读次数:
78
事务的基本流程: 开启事务:start transaction; 创建一个保存点:savepoint 保存点名 回到保存点(根据具体情况):rollback to保存点名 在MySQL上具体演示: 实务操作的注意事项: 1、如果没有设置事务保存点,也可以回滚,只能回滚到事务的开始,直接使用rollb ...
分类:
其他好文 时间:
2019-08-24 14:53:34
阅读次数:
75
一、数据结构 1.手写链表的基本操作(创建、新增节点、删除节点、销毁等) 2.链表的反转 3.如何判断一个链表有环 4.双向链表删除一个非头非尾节点 5.单向链表删除一个非头非尾节点 6.二叉树的前、中、后序遍历打印 7.STL中vector的内部实现原理 8.STL中vector与list的区别 ...
分类:
编程语言 时间:
2019-08-20 22:30:56
阅读次数:
139
JDK5提供原子类,及其操作 AtomicXXX是通过CAS , Unsafe.compareAndSwapInt实现的 简单分析一下原子类是如果使用cas,无锁却保证线程安全的 <! more 每条线程都有自己的本地缓存,他们要想操作变量,首先是把变量复制到自己的缓存中,然后处理数据,数据处理结束 ...
分类:
编程语言 时间:
2019-07-08 13:17:41
阅读次数:
101
锁偏向 锁偏向 synchronized默认采取非公平锁,锁偏向是指线程在释放锁后再次进入请求队列中等待获取锁时,虚拟机会优先唤醒该线程。并省去获取锁的操作,进行无锁操作。 代码: 输出片段: 轻量级锁 轻量级锁 当锁竞争比较激烈,偏向锁就会失效,例如这一段:t4 t4 t4 t0 t55 t2 t ...
分类:
其他好文 时间:
2019-07-03 00:42:57
阅读次数:
119
接上一篇,我们继续看 不知道大家第一次看这段代码的时候有没有一脸懵逼,反正我是一脸懵,为什么这个if else 最终都是调用的register0方法,都是一样的。 其实这里就是为什么Netty是线程安全的根本原因。 我们先看下 eventLoop.inEventLoop() 方法 第一张图传入了 当 ...
分类:
Web程序 时间:
2019-07-03 00:31:28
阅读次数:
118
发现 zeromq 的 yqueue_t 模板类,其数据存储理念设计得非常妙。借这一理念,按照 STL 的泛型类 queue 的接口标准,我设计了一个线程安全的 单生产者/单消费者(单线程push/单线程pop) FIFO 队列,以此满足更为广泛的应用。 1. 数据存储理念的 ...
分类:
其他好文 时间:
2019-06-30 18:54:29
阅读次数:
115
JDK8中引入了高性能的读写锁StampedLock,它的核心思想在于,在读的时候如果发生了写,应该通过重试的方式来获取新的值,而不应该阻塞写操作。这种模式也就是典型的无锁编程思想,和CAS自旋的思想一样。这种操作方式决定了StampedLock在读线程非常多而写线程非常少的场景下非常适用,同时还避 ...
分类:
其他好文 时间:
2019-06-16 11:50:38
阅读次数:
107