加入收藏 | 设为首页 | 会员中心 | 我要投稿 惠州站长网 (https://www.0752zz.com.cn/)- 办公协同、云通信、物联设备、操作系统、高性能计算!
当前位置: 首页 > 业界 > 正文

开发人员喜欢 Brackets 文本编辑器的原因

发布时间:2021-02-01 10:17:46 所属栏目:业界 来源:互联网
导读:这样虽然提速了但是会导致缓存一致性问题跟内存可见性问题。同时编译器跟CPU为了加速也引入了指令重排。指令重排的大致意思就是你写的代码运行运算结果会按照你看到的逻辑思维去运行,但是在JVM内部系统是智能化的会进行加速排序的。 1、编译器优化的重排序

这样虽然提速了但是会导致缓存一致性问题跟内存可见性问题。同时编译器跟CPU为了加速也引入了指令重排。指令重排的大致意思就是你写的代码运行运算结果会按照你看到的逻辑思维去运行,但是在JVM内部系统是智能化的会进行加速排序的。

1、编译器优化的重排序:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。

2、指令级并行的重排序:现代处理器采用了指令级并行技术在不影响数据依赖性前提下重排。

3、内存系统的重排序:处理器使用缓存和读/写缓冲区 进程重排。

指令重排这种机制会导致有序性问题,而在并发编程时经常会涉及到线程之间的通信跟同步问题,一般说是可见性、原子性、有序性。这三个问题对应的底层就是 缓存一致性、内存可见性、有序性。

原子性:原子性就是指该操作是不可再分的。不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作。在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性。比如 a = 1。

可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。Java保证可见性可以认为通过volatile、synchronized、final来实现。

有序性:程序执行的顺序按照代码的先后顺序执行,Java通过volatile、synchronized来保证。

为了保证共享内存的正确性(可见性、有序性、原子性),内存模型定义了共享内存模式下多线程程序读写操作行为的规范,既JMM模型,注意JMM只是一个约定概念,是用来保证效果一致的机制跟规范。它作用于工作内存和主存之间数据同步过程,规定了如何做数据同步以及什么时候做数据同步。
 

有的同学可能说,等等,在上一篇文章不是说还有代码区和动态链接库吗?

要知道这两个区域是不能被修改的,也就是说这两个区域是只读的,因此多个线程使用是没有问题的。

在刚才我们提到的堆区、数据区以及文件,这些就是所有的线程都可以共享的资源,也就是公共场所,线程在这些公共场所就不能随便浪了。

线程使用这些共享资源必须要遵守秩序,这个秩序的核心就是对共享资源的使用不能妨碍到其它线程,无论你使用各种锁也好、信号量也罢,其目的都是在维护公共场所的秩序。

知道了哪些是线程私有的,哪些是线程间共享的,接下来就简单了。

值得注意的是,关于线程安全的一切问题全部围绕着线程私有数据与线程共享数据来处理,抓住了线程私有资源和共享资源这个主要矛盾也就抓住了解决线程安全问题的核心。

接下来我们看下在各种情况下该怎样实现线程安全,依然以C/C++代码为例,但是这里讲解的方法适用于任何语言,请放心,这些代码足够简单。

只使用线程私有资源

我们来看这段代码:
 

共享锁

共享锁是指该锁可被多个线程所持有。如果线程T对数据A加上共享锁后,则其他线程只能对A再加共享锁,不能加排他锁。获得共享锁的线程只能读数据,不能修改数据。

对于ReentrantLock而言,其是独享锁。但是对于Lock的另一个实现类ReadWriteLock,其读锁是共享锁,其写锁是独享锁。

  1. 读锁的共享锁可保证并发读是非常高效的,读写,写读 ,写写的过程是互斥的。
  2. 独享锁与共享锁也是通过AQS来实现的,通过实现不同的方法,来实现独享或者共享。

可重入锁

若当前线程执行中已经获取了锁,如果再次获取该锁时,就会获取不到被阻塞。

(编辑:惠州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读