java并发编程实战学习 第1章

java并发编程实战学习

第一章 简介

  1. 并发简史

操作系统带来了并发程序,操作系统之前只能从头到尾执行一个程序

  1. 线程的优势
  • 发挥多处理器的强大能力
  • 建模的简单性
  • 异步事件的简化处理
  • 响应更灵敏的用户界面
  1. 线程带来的风险
  • 安全性问题

线程不安全情况

@NotThreadSafe
public class UnsafeSequence {
    private int value;
    
    /** 返回一个唯一的数 **/
    public int getNext() {
        return value++;
    }
}

value++包含了3个独立操作:读取value,将value加1,并将计算结果写入value。由于运行时可能将多个线程之间交替执行,因此这两个线程可能同时执行读操作,从而使得它们得到相同的值,并都将这个值加1。

图1-1 UnsafeSequence.getNext()的错误执行情况.png

这种称为竞态条件。

多线程要共享相同的内存空间地址,并且时并发运行,因此它们可能会访问或修改其他线程正在使用的变量。由于无法预测数据变化从而发生错误。要预测的话,必须对共享变量的访问进行协同。Java提供了各种同步机制来协同这种访问。

线程安全的情况

@TreadSafe
public class Sequence {
    @GuardedBy("this") private int value;

    public synchronized int getNext() {
        return value++;
    }
}

如果没有同步,那么无论是编译器、硬件还是运行时,都可以随意安排操作的执行时间和顺序,例如对寄存器或者处理器中的变量进行缓存,而这些被缓存的变量对于其他线程来说是暂时(甚至永久)不可见的。

  • 活跃性问题

一个线程一直等着另一个线程释放资源

  • 性能问题

带来额外的开销,线程调度。同步后抑制某些编译器优化。

  1. 线程无处不在

就是到处都是

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值