一、为什么要并发?

出现背景:操作系统的出现,使计算机同时运行多个程序成为可能。

1、目的:

资源利用率。某些时候,程序必须等待一些外部操作完成(IO)才能继续运行,在等待时间运行其他程序,可以有效提高资源利用率。

公平性。不同的用户和程序对计算机的资源有公平的利用率。

便利性。为了完成一个任务,同时运行多个计算机程序并进行通信,比只运行一个计算机程序更方便。

2、线程

线程也被称为轻量级进程,如果没有调度机制,线程将独立运行。同一进程中的所有线程共享进程的地址空间,实现了更细粒度的资源共享机制。

优势:降低程序的开发与维护成本,提升复杂应用程序的性能。线程能将大部分异步工作流转化成串行工作流,能更好地模拟人类工作和交互方式,并提高机器的资源利用率和吞吐量。

执行同一类型任务的优势:减少切换成本,程序更容易编写和测试,减少错误率。

风险

安全性:在没有充足同步的情况下,多个线程的执行顺序是不可预测的,甚至会产生奇怪的后果。

活跃性:潜在的阻塞问题。

性能:引入多线程后,线程调度带来的额外开销。

二、线程安全

1、核心:对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问。

“共享”意味着变量可以由多个线程同时访问,而“可变”则意味着变量的值可以在其生命周期内发生变化。一个对象是否线程安全,取决于它是否被多个线程访问,若要实现线程安全,需要采用同步机制来协同对对象可变状态的访问,如果无法实现协同,那么可能会导致数据破坏以及其他不该出现的结果。

Java同步机制:

关键字:synchronized

提供了一种独占的加锁方式。

2、定义:正确性

含义:某个类的行为与其规范完全一致。在良好的规范中,通常会定义各种不变性条件来约束的对象的状态,以及定义各种后验条件来描述对象操作的结果——代码可信性。

当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。

示例1:线程安全的Servlet

@ThreadSafe
public class StatelessFactorizer implements Servlet{
  public void service( ServletRequest req, ServletResponse resp){
      BigInteger i = extractFromRequest( req);
      BigInteger[] factors = factor( i);
      encodeIntoResponse( resp, factors);
  }
}

无状态的Servlet是线程安全的。

大多数的Servlet都是无状态的,从而极大地降低了实现Servlet线程安全时的复杂性问题。只有当Servlet处理请求时需要保存信息时,线程安全才会成为问题。

3、原子性

示例2:非线程安全的Servlet

@NotThreadSafe
public class UnsafeCountingFactorizer implements Servlet {
    private long count = 0;
    public long getCount(){
        return count;
    }

    public void service(ServletRequest req, ServletResponse resp){
        BigInteger i = extractFromRequest(req);
        BigInteger[] factors = factor(i);
    }
}

导致线程不安全的原因:count++并非一个原子性的操作,它包含三步操作:读取-写入-修改。如果两个线程同时读取值为9,并分别执行增加操作,则会导致最终值偏差1的情况。

Java并发编程入门(一)的更多相关文章

  1. Java并发编程入门与高并发面试(三):线程安全性-原子性-CAS(CAS的ABA问题)

    摘要:本文介绍线程的安全性,原子性,java.lang.Number包下的类与CAS操作,synchronized锁,和原子性操作各方法间的对比. 线程安全性 线程安全? 线程安全性? 原子性 Ato ...

  2. Java并发编程入门,看这一篇就够了

    Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容.这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类.当然这些都是并发编程的基本知识,除了使用这些工具以外,Java并发编程中涉 ...

  3. Java并发编程入门(二)

    1.竞态条件 1.1 定义 当某个计算的正确性取决于多个线程的交替执行时序时,就会发生竞态条件.换句话说,正确的结果要取决于运气. 最常见的竞态条件类型:先检查后执行(Check-Then-Act)操 ...

  4. Java并发编程实战3-可见性与volatile关键字

    1. 缓存一致性问题 在计算机中,每条指令都是在CPU执行的,而CPU又不具备存储数据的功能,因此数据都是存储在主存(即内存)和外存(硬盘)中.但是,主存中数据的存取速度高于外存中数据的存取速度(这也 ...

  5. Java 并发编程-不懂原理多吃亏(送书福利)

    作者 | 加多 关注阿里巴巴云原生公众号,后台回复关键字"并发",即可参与送书抽奖!** 导读:并发编程与 Java 中其他知识点相比较而言学习门槛较高,从而导致很多人望而却步.但 ...

  6. Java工程师学习指南第4部分:Java并发编程指南

    本文整理了微信公众号[Java技术江湖]发表和转载过的Java并发编程相关优质文章,想看到更多Java技术文章,就赶紧关注本公众号吧吧. [纯干货]Java 并发进阶常见面试题总结 [Java基本功] ...

  7. 如何深入学习Java并发编程?

    在讲解深入学习Java并发编程的方法之前,先分析如下若干错误的观点和学习方法. 错误观点1:学习Java编程主要是学习多线程. 这话其实是说明了表面现象,多线程其实还真是并发编程的实现方式,但在实际高 ...

  8. 【Java并发编程实战】----- AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...

  9. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

随机推荐

  1. 6.Python中内存是如何管理的?

    Python中内存是如何管理的? Python memory is managed by Python private heap space. All Python objects and data ...

  2. 热门云服务超87GB电子邮箱和密码泄露,黑客已验证大部分数据

    热门云存储服务Mega被曝发现超87GB电子邮件地址和密码泄露(源数据目前已被删除,但已流传到个别黑客网站),其中包含近7.73亿电子邮件地址和2200万密码. 近日,国外一名安全研究人员Troy H ...

  3. 24-Java-Spring框架(二)

    Spring框架的了解.SpringIOC的部分内容请阅读23-Java-Spring框架(二) 三.Spring Web MVC(Model View Controller) 1.SpringMVC ...

  4. 面试被问为什么使用Spring Boot?答案好像没那么简单

    面试官:项目中有使用Spring Boot吗? 小小白:用过. 面试官:说一下为什么要使用Spring Boot? 小小白:在使用Spring框架进行开发的过程中,需要配置很多Spring框架包的依赖 ...

  5. springboot rabbitmq 找不到队列

    错误报告: org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to ...

  6. jQuery中bind()与on()绑定事件的区别

    .on()方法比.bind()方法多一个参数selector .on()的selector参数是筛选出调用.on()方法的dom元素的指定子元素,如: $("ul").on('cl ...

  7. EEGLAB-批量处理.dat数据及保存脑电地形图

    步骤 1.先在图形界面操作一遍准备做的操作. 2.在命令行窗口输入 EEG.history 获取刚刚操作都用到哪些语句. 3.稍加修改即可以写一个批量化函数来读取生成数据. 4.在 EEGLAB\ee ...

  8. java web程序员微信群

    关注微信公众号"程序员成长日志",回复关键字"java"扫码进群 本群主要为大家解决工作中遇到的问题遇到的问题发到群里大家集思广益平时可以瞎扯不定期红包

  9. 设计模式之GOF23模板模式

    模板模式template method 场景:具有具体流程,但具体某一步的业务不同 到银行办理业务:排队取号,办理业务,给员工打分 请客吃饭:等待,点单,吃饭,结账 模板方法模式介绍:模板方法是编程常 ...

  10. [hdu5266]区间LCA

    题意:给一棵树,求节点L,L+1,...R的最近公共祖先 思路:先对树dfs一下,从根1出发,经过每条边时记录一下终点和到达这个点的时间截,令r[u]表示到达u这个节点的最早时间截,t[x]表示在时间 ...