Water2Wine

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

并发的基本性质

安全性

要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的可变的状态的访问。

共享意味着变量可以由多个线程同时访问,而可变意味着变量的值在其生命周期内可以发生变化。

一个对象是否需要是线程安全的,取决于它是否被多个线程访问。

在线程安全性的定义中,最核心的概念就是正确性。正确性的含义是,某个类的行为与其规范完全一致。用通俗的话说,“所见即所知”。

我们可以这样定义线程安全性:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。

活跃性

安全性的含义是“永远不发生糟糕的事情”,而活跃性则关注另外一个目标,即“某件正确的事情最终会发生”。 当某个操作无法继续执行下去时,就会发生活跃性问题。

在串行程序中,活跃性问题的形式之一便是无意中造成的无限循环。从而使循环之后的代码无法被执行。而线程将会带来其他的一些活跃性问题,我在之前的博客中说过的死锁、活锁以及饥饿都是活跃性问题。

性能问题

与活跃性问题密切相关的是性能问题。

活跃性意味着某件正确的事情最终会发生,但却不够好,因为我们通常希望正确事情尽快发生。

而性能问题包括多个方面,例如服务时间过长,响应不灵敏,吞吐量过低,资源消耗过高,或者可伸缩性降低等。

与活跃性和安全性一样,在多线程程序中不仅存在与单线程程序相同的性能问题,而且还存在由于实现线程而引入的其他性能问题。

我们使用多线程的目的是提升程序的整体性能,但是与单线程的方法相比,使用多个线程总会引入一些额外的性能开销。

造成这些开销的操作包括:线程之间的协调(如加锁、内存同步等),增加上下文切换,线程的创建和销毁,以及线程的调度等。如果我们多度地使用线程,那么这些开销可能超过由于提高吞吐量、响应性或者计算能力所带来的性能提升。

另一方面,一个并发设计很糟糕的程序,其性能甚至比完成相同功能的串行程序性能还要低。

想要通过并发来获得更好的性能就需要做到:更有效地利用现有处理资源,以及在出现新的处理资源时使程序尽可能地利用这些新资源。

线程的基本性质

原子性

原子性是指一个操作或者一连串的操作是不可中断的,要么全部执行成功要么全部执行失败。

这样说似乎有些抽象,我们可以举几个例子来看一下:

int a = 1;

a++;

两个语句看似都是不可分割的原子操作,但实际上只有第一个是原子操作。第一个语句是一个赋值语句,“赋值”只有一个操作,即讲一个数放置到一个内存中;

但是“a++”就不是了,a++实际上分为了三个操作:将a的值从内存中读出,将a的值加1,再将a的值输入原内存。

java内存模型中定义了8中操作都是原子的,不可再分的。

* lock(锁定):作用于主内存中的变量,它把一个变量标识为一个线程独占的状态;

* unlock(解锁):作用于主内存中的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定

* read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便后面的load动作使用;

* load(载入):作用于工作内存中的变量,它把read操作从主内存中得到的变量值放入工作内存中的变量副本

* use(使用):作用于工作内存中的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作;

* assign(赋值):作用于工作内存中的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作;

* store(存储):作用于工作内存的变量,它把工作内存中一个变量的值传送给主内存中以便随后的write操作使用;

* write(操作):作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中。

除了这8中原子操作外,如果我们想让一系列操作具备原子性,也可以使用synchronized内置锁创建同步代码。

有序性

在java内存模型中,为了性能优化,编译器和处理器会进行指令重排序;也就是说java程序天然的有序性可以总结为:如果在本线程内观察,所有的操作都是有序的;如果在一个线程观察另一个线程,所有的操作都是无序的。

如果一个线程访问另一个线程中的值,就有可能出现读值的滞后。

为了避免这个问题,可以使用volatile关键字。volatile可以使java内存不再对指令进行重排序。

可见性

可见性是指当一个线程修改了共享变量后,其他线程能够立即得知这个修改。

posted on 2020-03-11 09:55  Water2Wine  阅读(209)  评论(0编辑  收藏  举报