java并发编程——简介

1.1并发简介

以前的计算机是串行的,也就是一条条指令顺序执行,无法同时执行多条。操作系统定义了进程为程序运行的最小单位后,便开启了并发编程的概念,线程:轻量级进程,粒度更细,在进程中定义了多个线程,每个线程都有自己的程序计数器,栈等。

1.2线程优势

降低成本,易维护,提升性能。

1.3线程安全性简介

在没有充足同步的情况下,多个线程中的操作执行顺序是不可预测的。例如下面的代码,在单线程环境中,这个类能够正确的工作,但在多线程环境中则不能。

public class UnsafeSquence{
    private int value;
    
    /** 返回一个奇怪的数值。**/
    public int getNest(){
        return value++;
    }
}

如果执行时机不对,两个线程在调用getNext时会得到相同的值。虽然自增运算++看上去是一个独立的操作,实际上是它包含了三个独立的操作:读value、将value+1、将计算结果写入value。而在运行时可能多个线程之间的操作交替执行,因此这两个线程可能同时执行读操作,从而使得它们得到相同的值,下图可以很好的表示其中一个情况。

A: [value->9]  ——>    [9+1->10]   ——>  [value=10]

B:     ——>  [value->9]   ——>   [9+1=10]     ——>   [value=10]

可以看到由于交替运行,调用了两次getNext()函数,但value都读为10,这就是一个线程不安全的类。

而这种常见的并发安全问题称为竞态条件,在多线程环境下,是否返回唯一的值取决于运行时操作的交替执行,而这是开发者不希望见到的,对于上述代码可以将函数改为一个同步方法,public syncharonized int getNext(){}便可修复上述方法。

活跃性问题:安全性的含义是“永远不会发生糟糕的事情”,而活跃性关注于另一个目标,“某件正确的事情最终会发生”。当某个操作无法继续执行下去时,就会发生这个问题。在串行程序中,活跃性问题的形式之一就是无意中造成的无限循环。而在多线程环境中,线程也将带来类似的问题,例如,线程A在等待线程B释放其持有的资源,而线程B永远不释放该资源,则A就会永远等待下去。而我们利用锁之类的机制便可避免这类问题。

性能问题:性能包括很多方面,不管开发串行还是并发程序都需要考虑性能问题,多线程环境中,线程过多,频繁的出现上下文切换操作,共享数据时,必须使用同步,而同步又可能抑制某些编译器优化,这都是我们需要考虑的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值