原先多线程并发编程的学习笔记和代码整理一下贴上来。
---------------------------------
原子操作
一、什么是原子操作
原子操作是不能被线程调度机制中断的操作。一旦操作开始,它一定可以在可能发生的上下文切换之前(切换到其他线程执行)执行完毕。
原子操作可以应用于除long和double之外所有基本类型之上的简单操作。对于读取和写入除long和double之外的基本类型变量这样的操作,可以保证它们会被当作不可分的操作来操作内存。但64位的long和double读取和写入会被当作2个分离的32位操作来执行,这就产生一个读取和写入操作中间发生上下文切换,从而导致不同任务看到不正确的结果。
当定义long和double时,如果使用volatile,就会获得原子性。声明为volatile的域会立即写入主存中,而读取操作就发生在主存中。
多个线程同时访问某个域,那么这个域就应该是volatile的,否则这个域就应该只能由同步来访问。
但如果一个域的值依赖于它先前的值(例如计数器),或者一个域的值依赖于别的域值限制,volatile就无法正常工作。所以第一选择仍是使用synchronized关键字。
二、java.util.concurrent.atomic
从javase5开始,新加入了java.util.concurrent.atomic包, JDK文档中描述为:
类的小工具包,支持在单个变量上解除锁的线程安全编程。事实上,此包中的类可将volatile值、字段和数组元素的概念扩展到那些也提供原子条件更新操作的类。
在atomic包中提供了原子性变量类如AtomicBoolean、AtomicInteger、AtomicLong和AtomicReference等。
使用原子性变量类可以去除同步代码,但原子性变量类是被用来设计实现java.util.concurrent中的类,因此只有在特殊情况下再使用它们,一般常用于性能调优。
下面是一个对AtomicInteger的简单测试:
public class AtomicIntegerTest implements Runnable{ private AtomicInteger ait = new AtomicInteger(0); private void increment(){ ait.addAndGet(2); } private int get(){ return ait.get(); } @Override public void run() { while(true){ //每个线程都循环累加 increment(); try{ TimeUnit.MILLISECONDS.sleep(200); }catch(Exception e){ e.printStackTrace(); } } } public static void main(String[] args) throws Exception { ExecutorService es = Executors.newCachedThreadPool(); AtomicIntegerTest task = new AtomicIntegerTest(); for(int i=0;i<5;i++){ es.submit(task); } TimeUnit.SECONDS.sleep(1);//保证5个任务都已经启动 while(true){ int value = task.get(); if(value%2 != 0){ System.out.println("error value!"); System.exit(0); }else{ System.out.println("value:"+task.get()); } TimeUnit.MILLISECONDS.sleep(500); } } }
上面的示例程序中,首先创建了一个线程池,开启5个线程,每个线程都循环对原子性变量AtomicInteger累加2,同时循环读取AtomicInteger的值,如果该值%2!=0的话,则说明出现了非原子性操作,程序停止,但本程序会一直运行下去打印出value的值。同时注意increment方法并没有加锁。
相关推荐
Java并发编程:设计原则与模式(第二版).pdf
C++并发编程实战 示例源源码 (C++ Concurrency in Action)
Java并发编程:设计原则与模式(第二版)
【小家java】JUC并发编程之:虚假唤醒以及推荐的解决方案.docx
Java并发编程:volatile关键字解析
Java并发编程:设计原则与模式(第二版)
java并发编程:设计原则与模式.rar
并发二:原子性、可见性、有序性
本文的主题是关于具有java语言风格的Thread、synchronized、volatile,以及J2SE5中新增的概念,如锁(Lock)、原子性(Atomics)、并发集合类、线程协作摘要、Executors。开发者通过这些基础的接口可以构建高并发、线程...
linux大神paul作品,详细介绍了并发编程的各种概念。内存屏障,mutex等。值得一读。
Java并发编程:线程池的使用 - 平凡希 - 博客园平凡希博客园首页联系管理随笔 - 127 文章 - 1 评论 - 94Java并发编程:线程池的使用在前面
Java并发编程:设计原则与模式Java并发编程:设计原则与模式
高并发和并发编程并发编程:线程安全+线程封闭+线程调度
│ 高并发编程第二阶段08讲、并发编程的三个重要概念,原子性,可见性,有序性.mp4 │ 高并发编程第二阶段09讲、指令重排序,happens-before规则精讲.mp4 │ 高并发编程第二阶段10讲、volatile关键字深入详解.mp4...
Java并发编程:设计原则与模式(第二版)
java高并发编程
原子操作类, 发容器 & 并发工具, 线程池, 并发实践 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行。Java具有简单、可移植、高性能和...
java并发编程pdf文档第二部分:Java并发编程实战.pdf、Java多线程编程核心技术.pdf、实战Java高并发程序设计.pdf
B站楠哥JUC Java并发编程
Java高并发编程,构建并发编程知识体系,提升面试成功率,完整版17章视频教程下载。 本课程将结合大量图示及代码演示,带你掌握多线程并发编程(线程安全,线程调度,线程封闭,同步容器等)与高并发处理思路与手段...