atomic

synchronized和lock两种悲观锁的比较

。_饼干妹妹 提交于 2020-11-02 19:41:31
synchronized和lock 都属于悲观锁,都是采取加锁的机制进行同步。 1. synchronized和lock的性能比较 在JDK1.5中,synchronized是性能低效的。因为这是一个重量级操作,它对性能最大的影响是阻塞的是实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性带来了很大的压力。相比之下使用Java提供的Lock对象,性能更高一些。在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态; 到了JDK1.6,发生了变化,对synchronize加入了很多优化措施,有自适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。导致在JDK1.6上synchronize的性能并不比Lock差。官方也表示,他们也更支持synchronize,在未来的版本中还有优化余地,所以还是提倡在synchronized能实现需求的情况下,优先考虑使用synchronized来进行同步。 2.synchronized和lock的用法比较 基本语法上,ReentrantLock与synchronized很相似,它们都具备一样的线程重入特性。synchronized是在JVM层面上实现的

goroutine间的同步&协作

假如想象 提交于 2020-11-01 19:04:39
Go语言中的同步工具 基础概念 竞态条件(race condition) 一份数据被多个线程共享,可能会产生争用和冲突的情况。这种情况被称为竞态条件,竞态条件会破坏共享数据的一致性,影响一些线程中代码和流程的正确执行。 同步 同步可以解决竞态问题。它本质上是在控制多个线程对共享资源的访问。这种控制主要包含两点: 避免多个线程在同一时刻操作同一个数据块。 协调多个线程,以避免它们在同一时刻执行同一个代码块。 在同步控制下,多个并发运行的线程对这个共享资源的访问是完全串行的。对这个共享资源进行操作的代码片段可以视为一个临界区。 互斥量sync.Mutex 一个互斥锁可以被用来保护一个临界区或者一组相关临界区。它可以保证,在同一时刻只有一个 goroutine 处于该临界区之内。 每当有 goroutine 想进入临界区时,都需要先加锁,每个 goroutine 离开临界区时,都要及时解锁。 Mutex的使用 var mutex sync.Mutex func updatePublicResource() { mutex.Lock() doUpdate() mutex.Unlock() } 使用互斥锁的注意事项: 不要重复锁定互斥锁。 不要忘记解锁互斥锁,推荐使用defer。 不要对尚未锁定或者已解锁的互斥锁解锁。 不要在多个函数之间直接传递互斥锁。(即,不要复制锁)

【第一性原理】Centos7下编译并行lammps-7Aug19

蓝咒 提交于 2020-10-31 13:33:55
LAMMPS即Large-scale Atomic/Molecular Massively Parallel Simulator,可以翻译为大规模原子分子并行模拟器,主要用于分子动力学相关的一些计算和模拟工作,一般来讲,分子动力学所涉及到的领域,LAMMPS代码也都涉及到了。 一、环境介绍: 系统:Centos7.6 所需软件包:lammps.tar.gz,parallel_studio_xe_2017_update5.tgz 二、上传、解压、软件包: 1.为了方便管理,新建一个目录,把intel和lammps软件包拷贝或直接上传到新建目录中。 [zh@zh ~]$ mkdir soft #新建目录 [zh@zh ~]# cd /soft/ #进入刚刚新建的目录中 [zh@zh soft]$ ls #查看目录中的文件 lammps.tar.gz [zh@zh ~]$ tar xf lammps.tar.gz #解压lammps 三、编译lammps: ps:由于我上次安装vasp时已经安装过intel2017u5,所以这次不再重新安装,如有需要intel安装教程的请转到 【第一性原理】Centos7下安装vasp5.4.4 如果有特殊需求,那么在安装lammps可执行文件之前要先安装一些额外的包,如在正式编译之前输入这样的命令make yes-class2 yes-rigid

多线程-1117

穿精又带淫゛_ 提交于 2020-10-31 05:58:50
规律: 多线程协作中,一般被考虑使用的,无非就是: (同步工具类) Semaphore ( semaphore.acquire() ;消耗许可数,许可数为负数时,当前线程将被阻塞 semaphore.release() ;增加许可数 ) CountDownLatch ( countDown.countDown() 初始值减1,当前线程总是不会被阻塞 countDown.await() 若值不为0则会被阻塞,等待初始值减为0才会恢复 ) CyclicBarrier ( cyclicBarrier.await() 初始值减1,并阻塞等待初始值减为0。最后一个线程将它减为0之后,若有指定任务,则还需要负责执行指定任务完毕,之后会唤醒之前被阻塞的所有线程,并重置为初始值。 有两个构造方法,其中一个构造方法可以指定每次最后一个线程,需要执行的额外任务。 cyclicBarrier.reset() 用于提前唤醒被阻塞的线程,并重置为初始值 ) (原子变量类) AtomicInteger 一般用于无锁进行自增计数情形 (锁) volatile + ( ReentrantLock + Condition ) / s ynchronized 通过 condition.await()/condition.signal() 或者 object.wait()/object.notify() 的 挂起

C++标准库-17-并发

僤鯓⒐⒋嵵緔 提交于 2020-10-28 16:42:53
C++标准库-17-并发 命名空间namespace std::this_thread提供了几个线程相关的专属操作:get_id、sleep_for、sleep_until以及yield。 C++标准库启动线程的方法可分为三类:async、thread以及packaged_task。其中,async一般和futrue或者shared_future搭配,thread一般和promise搭配(也要结合future使用),packaged_task一般和future搭配。 通过静态函数 unsigned int std::thread::hardware_concurrency() ,可以查询并行线程的可能数量(仅供参考)。 async和future 一般概念 利用async和future可以很方便地进行并发执行。 async会尝试在新的线程中异步执行对应的函数foo,但是不保证一定会执行。应将async返回值赋值给一个future对象fobj,通过调用该future对象的get成员函数,确保该函数foo的执行。 调用future对象的get成员函数,可能有三种情况发生: 如果foo函数被启动于一个新线程,并且已经执行结束,那么get立刻返回执行结果; 如果foo函数被启动于一个新的线程,但是尚未结束,那么get会阻塞等待foo执行结束后获得结果并返回; 如果foo尚未启动,会被强迫启动

Volatile相关知识点

核能气质少年 提交于 2020-10-26 06:30:29
文章目录 volatile内存定义 特点 使用场景 volatile内存定义 当写一个volatile变量时,JMM会将该线程写入到工作内存的值同步刷新到主内存中。 当读一个volatile变量时,JMM会将该线程工作内存中的值置为无效,直接从主内存中读取值并刷新到工作内存中。 特点 只能用来修饰变量 可以保证变量的可见性 ,也就是当这个变量修改后,所有线程都会被要求重新从主内存中再次拷贝一次该变量的值到工作空间中。主要是通过两个操作来保证共享变量的可见性: 1、被volatile关键词修饰的变量,当CPU处理完该数据将数据刷回高速缓存区时,会立马将数据刷回内存。 2、当被volatile关键词修饰的变量刷回内存时,立马让其他CPU中使用的该变量无效,在最开始时是采用在总线上添加LOCK#锁来做的,但该方式效率比较低,后续Intel将实现方式改为只要CPU在修改了被volatile修饰的共享变量后,就会向其他CPU发出信号,将读取到工作内存中的变量无效化,而其他CPU在需要使用这个变量时,如果检测到这个无效信号,就会重新从主内存中再次读取一次该变量的值,从而保证了可见性。 同时该关键词还可以禁止指令重排,实现原理一个是在字节码层面添加了ACC_VOLATILE关键词保证,另一个是在JVM中通过插入内存屏障来保证,内存屏障就是保证前者执行完之后才执行后者,有点类似依赖关系

【JUC源码】atomic类源码浅析

放肆的年华 提交于 2020-10-25 09:16:03
在 java.util.concurrent.atomic 包中,Atomic 打头的原子操作类有很多。涉及到 Java 常用的数字类型的,基本都有相应的 Atomic 原子操作类,如下图所示: Atomic 打头的原子操作类,在高并发场景下,都是线程安全的,我们可以放心使用。 1.AtomicInteger 主要是调用Unsafe类的CAS操作,下面是 AtomicInteger 的部分源码: public class AtomicInteger extends Number implements java . io . Serializable { // 注:value是被volatile修饰的 private volatile int value ; // 初始化 public AtomicInteger ( int initialValue ) { value = initialValue ; } // 得到当前值 public final int get ( ) { return value ; } // 自增 1,并返回自增之前的值 public final int getAndIncrement ( ) { return unsafe . getAndAddInt ( this , valueOffset , 1 ) ; } // 自减 1,并返回自增之前的值