Java并发编程实战读书笔记(一)

1.1并发简史
早期的计算机不包含操作系统,从头到尾执行一个程序,并且这个程序能访问计算机中的所有资源。缺点:不易编写和运行程序,且浪费资源。

操作系统的出现使得计算机每次能运行多个程序,并且不同的程序都在独立的进程中运行:操作系统为各个独立执行的进程分配各种资源。

操作系统实现多个程序的同时执行,主要是基于以下原因:
1.资源利用率:避免了IO等操作在等待状态下无法执行其他动作。
2.公平性:保证不同用户和程序对于计算机上的资源有着同等的使用权。
3.便利性:只编写一个程序计算所有任务不易实现。

线程会共享进程范围内的资源,但每个线程都有各自的PC、栈以及局部变量等。
线程也被称为轻量级进程。操作系统是以线程(而不是进程)作为基本的调度单位。

1.2线程的优势

  • 发挥多核处理器的性能,避免资源浪费
  • 把一种类型的任务放到一个线程中完成,而不是所有的任务在一起执行,更加容易实现
  • 服务器可以为每一个连接都分配一个线程(同步IO),而不是一个线程完成几个连接(非阻塞IO),更加简单
  • 多线程使得执行任务的时间变得更加短暂,提高了GUI界面的灵敏度

1.3线程带来的问题

  • 安全性问题
@NotThreadSafe
public class UnsafeSequence{
    private int value;
    //返回一个唯一的值
    public int getNext(){
        return value++;
    }
}

由于value++并不是单个操作(原子操作),包括了三个独立的操作:
1.读取value
2.value+1
3.把计算结果写回value
这样在多线程的情况下就会出现竞态问题(Race Condition)。
Java并发编程实战读书笔记(一)_第1张图片
或者说是缓存一致性问题。即线程B在执行value++时,并没有读取到value的最新的数据(读取到的9是脏数据),从而产生非预期的结果。

@ThreadSafe
public class Sequence{
    private int value;

    public synchronized int getNext(){
        return value++;
    }
}
  • 死锁、饥饿、活锁
  • 性能问题:衡量指标包括服务时间、响应、吞吐率、资源消耗、伸缩性等。要注意权衡线程带来的性能提升和线程切换带来的消耗(保存和恢复执行上下文)。线程同步机制往往也会抑制编译器的优化,使内存缓冲区数据无效,这些都带来了额外的性能开销。

1.4线程无处不在
对线程安全性的需求不能局限在被调用的代码,而是要延伸到需要访问这些代码所访问的程序状态的所有代码路径。
Timer、Servlet和Jsp、RMI、Swing和AWT

你可能感兴趣的:(Java并发)