atomic

Real-world examples for ABA in multithreading [closed]

ぃ、小莉子 提交于 2021-02-06 02:34:19
问题 As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance. Closed 7 years ago . I'm looking for some nice real-world examples of the ABA-problem causing trouble in multithreaded code. The ABA-problem occurs in

Java游戏服务器4

独自空忆成欢 提交于 2021-02-05 10:09:02
1)消息识别器: 根据消息号,创建一个Builder。 2)javassist:动态修改字节码。==》用于ormtest 原生反射很慢,那我可以用javaassist来加速 3)一些框架没有实现类,是怎么实现出来的。 4)多线程与IO 5)先讲解移动。 攻击的话,就是涉及到多线程的问题。 6)A和B同时攻击C时,A和B 分别在自己的线程,因此有并发访问安全的问题。 7)多个线程操作同一份数据,数据不一致的问题。解决方案 (1)加锁 synchronized: 一个减血的函数暂时没有问题: 执行效率不高甚至都不是关键的。 但是如果有别的函数呢? attkUser(User user); 这种带来了死锁。 互砍造成了死锁!!! jps ==》 得到进程及其对应的pid,,如自己Server的pid。 jstack 7996 ==》得到死锁信息。 数据不一致,和死锁。 减少锁的粒度,可以减少死锁(并非避免死锁)。 但是开发困难,与业务逻辑重合了。 (2)脏读:多线程操作同一份数据,脏读。 volatile也不行。它只保证2个线程是可见的。 不能是原子的。 (3)atomic: 单个操作,能保证线程安全,用cas原语保证,但是十分臃肿! 道具的id,任务的状态。。。对象太大,太臃肿的。 但是,同时操作a和b,则依然是数据不一致的问题。 来源: oschina 链接: https://my

Why should I use a reduction rather than an atomic variable?

拥有回忆 提交于 2021-02-04 07:28:51
问题 Assume we want to count something in an OpenMP loop. Compare the reduction int counter = 0; #pragma omp for reduction( + : counter ) for (...) { ... counter++; } with the atomic increment int counter = 0; #pragma omp for for (...) { ... #pragma omp atomic counter++ } The atomic access provides the result immediately, while a reduction only assumes its correct value at the end of the loop. For instance, reductions do not allow this: int t = counter; if (t % 1000 == 0) { printf ("%dk iterations

深入探究Lua的GC算法(下)-《Lua设计与实现》

a 夏天 提交于 2021-02-04 04:27:50
紧接着上一篇文章 zblade:深入探究Lua的GC算法(上)-《Lua设计与实现》 这篇文章让我们收尾GC的具体后续操作。转载请标明出处: http://www.cnblogs.com/zblade/ 3、GC的扫描阶段 GCSpropagate 只要处于这个阶段,就会分2种情况执行,一个是propagatemark,一个是atomic,让我们分别看其实现过程。 首先看处于灰色链表中一直都有对象的情况,在这步操作当中,是可以分步操作的,整个GC的分步操作,就是在这一步操作中,在每次扫描后,都会返回本次扫描标记的对象的大小之和,再下一个分步执行的时候再继续执行,而一旦进入atomic函数中,就需要一次性的执行,不能再分步执行了。 来看propagatemark函数是如何实现的: 对于table,如果该表是weak表,则退回到灰色状态,否则遍历表的数组和散列表部分进行标记,详见traversetable函数; 对于func,traverseclosure主要对func中的upval进行标记; 对于thread, 则将其移植到grayagain中,放在atomic中进行处理; 对于proto,对其中的字符串、upvalue、局部变量等进行遍历标记; 注意,这儿没有处理string\udata类型数据,这是放在其他部分进行的,不需要进行相关的标记; 4、GC 扫描阶段的barrier操作

golang 读写锁

北城余情 提交于 2021-02-03 00:07:13
RWMutex:是基于Mutex实现的读写互斥锁,一个goroutine可以持有多个读锁或者一个写锁,同一时刻只能持有读锁或者写锁 type RWMutex struct { w Mutex // 互斥锁 writerSem uint32 // 写锁信号量 readerSem uint32 // 读锁信号量 readerCount int32 // 读锁计数器 小于0时表示存在写锁 readerWait int32 // 获取写锁时需要等待的读锁释放数量 } const rwmutexMaxReaders = 1 << 30 //最大读锁数目 // RLock locks rw for reading. func (rw *RWMutex) RLock() { //获取读锁 if race.Enabled { _ = rw.w.state race.Disable() } if atomic.AddInt32(&rw.readerCount, 1) < 0 {//存在写锁 // A writer is pending, wait for it. runtime_Semacquire(&rw.readerSem) //等待获取读信号量 } if race.Enabled { race.Enable() race.Acquire(unsafe.Pointer(&rw.readerSem

java安全编码指南之:可见性和原子性

梦想的初衷 提交于 2021-01-31 08:37:46
简介 java类中会定义很多变量,有类变量也有实例变量,这些变量在访问的过程中,会遇到一些可见性和原子性的问题。这里我们来详细了解一下怎么避免这些问题。 不可变对象的可见性 不可变对象就是初始化之后不能够被修改的对象,那么是不是类中引入了不可变对象,所有对不可变对象的修改都立马对所有线程可见呢? 实际上,不可变对象只能保证在多线程环境中,对象使用的安全性,并不能够保证对象的可见性。 先来讨论一下可变性,我们考虑下面的一个例子: public final class ImmutableObject { private final int age; public ImmutableObject ( int age) { this .age=age; } } 我们定义了一个ImmutableObject对象,class是final的,并且里面的唯一字段也是final的。所以这个ImmutableObject初始化之后就不能够改变。 然后我们定义一个类来get和set这个ImmutableObject: public class ObjectWithNothing { private ImmutableObject refObject; public ImmutableObject getImmutableObject () { return refObject; } public

Java并发编程之CAS和AQS

依然范特西╮ 提交于 2021-01-29 01:26:49
什么是CAS > CAS(compare and swap) ,字面意思比较并交换,是解决多线程并行情况下使用锁造成性能损耗的一种机制. public final boolean compareAndSet(int expect, int update) { return unsafe.compareAndSwapInt(this, valueOffset, expect, update); } > CAS 有三个操作数, valueOffset 内存值, expect 期望值, update 要更新的值。如果内存值( valueOffset )和期望值( expect )是一样的。那么处理器会将该位置的值更新为( update ),否则不做任何操作。 > CAS 有效地说明了“我认为位置 valueOffset 应该包含值 expect ,如果包含该值,则将 update 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。”在 Java 中,sun.misc.Unsafe类提供了硬件级别的原子操作来实现这个 CAS,java.util.concurrent包下的大量类都使用了这个Unsafe类的 CAS 操作 CAS的应用 > java.util.concurrent.atomic 包下的类大多数是使用 CAS 实现的,如 AtomicInteger ,

java安全编码指南之:可见性和原子性

橙三吉。 提交于 2021-01-27 06:22:59
点击 上方的 蓝字 关注我吧 程序那些事 简介 java类中会定义很多变量,有类变量也有实例变量,这些变量在访问的过程中,会遇到一些可见性和原子性的问题。这里我们来详细了解一下怎么避免这些问题。 不可变对象的可见性 不可变对象就是初始化之后不能够被修改的对象,那么是不是类中引入了不可变对象,所有对不可变对象的修改都立马对所有线程可见呢? 实际上,不可变对象只能保证在多线程环境中,对象使用的安全性,并不能够保证对象的可见性。 先来讨论一下可变性,我们考虑下面的一个例子: public final class ImmutableObject { private final int age; public ImmutableObject ( int age) { this .age=age; }} 我们定义了一个ImmutableObject对象,class是final的,并且里面的唯一字段也是final的。所以这个ImmutableObject初始化之后就不能够改变。 然后我们定义一个类来get和set这个ImmutableObject: public class ObjectWithNothing { private ImmutableObject refObject; public ImmutableObject getImmutableObject ( ) { return

On x86-64, is the “movnti” or “movntdq” instruction atomic when system crash?

痴心易碎 提交于 2021-01-27 05:35:15
问题 When using persistent memory like Intel optane DCPMM, is it possible to see partial result after reboot if system crash(power outage) in execution of movnt instruction? For: 4 or 8 byte movnti which x86 guarantees atomic for other purposes? 16-byte SSE movntdq / movntps which aren't guaranteed atomic but which in practice probably are on CPUs supporting persistent memory. 32-byte AVX vmovntdq / vmovntps 64-byte AVX512 vmovntdq / vmovntps full-line stores bonus question: MOVDIR64B which has

On x86-64, is the “movnti” or “movntdq” instruction atomic when system crash?

故事扮演 提交于 2021-01-27 05:35:12
问题 When using persistent memory like Intel optane DCPMM, is it possible to see partial result after reboot if system crash(power outage) in execution of movnt instruction? For: 4 or 8 byte movnti which x86 guarantees atomic for other purposes? 16-byte SSE movntdq / movntps which aren't guaranteed atomic but which in practice probably are on CPUs supporting persistent memory. 32-byte AVX vmovntdq / vmovntps 64-byte AVX512 vmovntdq / vmovntps full-line stores bonus question: MOVDIR64B which has