JAVA 并发相关总结

简介

自从JAVA 创建以来,java 就支持类似锁与线程的并发操作。本篇内容主要帮助JAVA 开发者理解和应用JAVA 的核心并发概念 以及如何应用。

概念

概念 介绍
原子性  一个原子操作就是要么全部成功,要么全部失败 
可见性  可见性是指 一个线程是否可以看到另一个线程的修改    

表 1并发概念

条件竞争

竞争产生的条件是当一个以上线程对同一个共享对象发生一系列操作, 并且会根据不同线程的执行顺序不同产生不同的结果. 下面的代码就不是线程安全的 value 值会被初始化多次, 因为执行顺序 check-then-act ( 检测是否为 null, 然后进行初始化) 导致懒加载的操作并不是原子性的:

class Lazy <T> {
  private volatile T value;
  T get() {
    if (value == null)
      value = initialize();
    return value;
  }
}

具体原因:... //todo

数据竞争

一个数据竞争产生的原因是 当超过两个线程尝试操作相同的 非 final 操作符定义的 变量并且没有使用synchronize 做线程同步的时候 。没有采用线程同步将会导致线程间的操作可见性,  产生的读取旧数据的情况 , 将会导致诸如无限循环、数据结构冲突、计算错误等情况 。下面的代码将会产生无限循环 ,因为读线程无法观察到 写线程的修改 :

class Waiter implements Runnable {
  private boolean shouldFinish;
  void finish() { shouldFinish = true; }
  public void run() {
    long iteration = 0;
    while (!shouldFinish) {
      iteration++;
    }
    System.out.println("Finished after: " + iteration);
  }
}
class DataRace {
  public static void main(String[] args) throws InterruptedException {
    Waiter waiter = new Waiter();
    Thread waiterThread = new Thread(waiter);
    waiterThread.start();
    waiter.finish();
    waiterThread.join();
  }
}

原文地址:https://www.cnblogs.com/glory-jzx/p/12257483.html

时间: 2024-10-15 04:05:05

JAVA 并发相关总结的相关文章

java并发相关内容

1. vilatile,锁和原子操作 这三个是理解java并发的基础. 简单来说,vilatile修饰的变量,可以保证对其的改变所有线程可见,这个机制实际上也是依赖原子操作的: 锁,主要分为偏向锁,轻量级锁和重量级锁:资源消耗也是越来越大的.使用java的synchronized的关键字或者新的锁用法,都是在这三种锁中做选择,jdk6之后默认优先使用偏向锁,也可以通过UseBaisedLocking=false关闭偏向锁.使用偏向锁的依据,一个是客观事实,通常都是同一个线程获取锁:另一个也是考量

java并发相关(四)—— 线程的七种状态

我们知道线程一共有七种状态,之间转换如下图: 锁池与等待池 原文地址:https://www.cnblogs.com/fbw-gxy/p/11689566.html

特约稿件 Java并发教程(Oracle官方资料)

本文是Oracle官方的Java并发相关的教程,感谢并发编程网的翻译和投递. (关注ITeye官微,随时随地查看最新开发资讯.技术文章.) 计算机的使用者一直以为他们的计算机可以同时做很多事情.他们认为当其他的应用程序在下载文件,管理打印队列或者缓冲音频的时候他们可以继续在文字处理程序上工作.甚至对于单个应用程序,他们任然期待它能在在同一时间做很多事情.举个例子,一个流媒体播放程序必须能同时完成以下工作:从网络上读取数字音频,解压缩数字音频,管理播放和更新程序显示.甚至文字处理器也应该能在忙于重

今天学了点并发相关的知识

Java并发相关知识集锦 1.class文件 class文件包含JAVA程序执行的字节码:数据严格按照格式(虚拟机要求的一种规范)紧凑排列在class文件中的二进制流,中间无任何分隔符:文件开头有一个0xcafebabe(16进制)特殊的一个标志. 这类文件专门给JVM读里面的内容,因此具有很复杂的格式,程序员阅读可以进行工具查看. 1.1查看class文件内容 Demo1.class的内容如下: public class Demo1 { public static void main(Stri

Java集合相关面试问题和答案

Java集合相关面试问题和答案 面试试题 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array.随着集合的广泛使用,Java1.2提出了囊括所有集合接口.实现和算法的集合框架.在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久.它还包括在Java并发包中,阻塞接口以及它们的实现.集合框架的部分优点如下: (1)使用核心集合类降低开发成本,而非实现我们自己的集合类.

6、Java并发编程:volatile关键字解析

Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatil

Java并发框架——什么是AQS框架

什么是AQS框架 1995年sun公司发布了第一个java语言版本,可以说从jdk1.1到jdk1.4期间java的使用主要是在移动应用和中小型企业应用中,在此类领域中基本不用设计大型并发场景,当然也没有大型互联网公司使用java,因为担心它本身的性能.在互联网及服务器硬件迅猛的发展下,sun公司更加注重企业级应用方面,毫无疑问高并发是一个重要的主题,于是在J2SE5.0(jdk1.5)代号为老虎的版本中增加了更加强大的并发相关的操作包--java.util.concurrent.此后java在

Java并发编程笔记 并发概览

并发概览 >>同步 如何同步多个线程对共享资源的访问是多线程编程中最基本的问题之一.当多个线程并发访问共享数据时会出现数据处于计算中间状态或者不一致的问题,从而影响到程序的正确运行.我们通常把这种情况叫做竞争条件(race condition),把并发访问共享数据的代码叫做关键区域(critical section).同步就是使得多个线程顺序进入关键区域从而避免竞争条件的发生. >>线程安全性 编写线程安全的代码的核心是要对状态访问操作进行管理,尤其是对共享的和可变的状态访问. 线

关于Java并发编程的总结和思考

编写优质的并发代码是一件难度极高的事情.Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的实践后,实现并发编程就有了更多的方案和更好的选择.本文是对并发编程的一点总结和思考,同时也分享了Java5以后的版本中如何编写并发代码的一点点经验. 为什么需要并发 ??并发其实是一种解耦合的策略,它帮助我们把做什么(目标)和什么时候做(时机)分开.这样做可以明显改进应用程序的吞吐量(获得更多的CPU调度时间)和结构(程序有多个部分在协同