【Java并发.3】对象的共享】的更多相关文章

首先简单介绍一下volatile的应用,volatile作为Java多线程中轻量级的同步措施,保证了多线程环境中“共享变量”的可见性.这里的可见性简单而言可以理解为当一个线程修改了一个共享变量的时候,另外的线程能够读到这个修改的值.下面就是volatile的具体定义和实现原理.上一篇Java内存模型 一.volatile的定义和实现原理 1.Java并发模型采用的方式 a)线程通信的机制主要有两种:共享内存和消息传递. ①共享内存:线程之间共享程序的公共状态,通过写-读共享内存中的公共状态来进行…
1. 一些原则 RIM(Remote Method Invocation):远程方法调用 Race Condition:竞态条件 Servlet要满足多个线程的调用,必须是线程安全的 远程对象,即通过远程方法调用将对象放入字节流中传给其他jvm的对象,要特别注意对象中的共享状态 Shared:共享的 Mutable:可变的 当设计线程安全的类时,良好的面向对象技术.不可修改性,以及明晰的不变性规范都能起到一定的帮助作用: 无状态对象是线程安全的:没有任何域也不包含任何对其他类中域的引用(比如St…
Java Concurrency in Practice,一本完美的Java并发参考手册. 查看豆瓣读书 推荐:InfoQ迷你书<Java并发编程的艺术> 第一章 介绍 线程的优势:充分利用多处理器简化模型简化异步事件的处理提供用户界面的响应(时间)线程的风险:安全的风险(不好的事情会发生),提高错误出现的几率活性的风险(好的事情不会发生),如某些代码不会执行,出现死锁.活锁以及饥饿性能的风险,不好的多线程编程可能会危害性能 第二章 线程安全 编写线程安全的代码,实质是管理对状态的访问,尤其是…
一.可见性 什么是可见性? Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化. 后者就是可见性的描写叙述即多线程能够实时获取其它线程改动后的状态.      *** 待补充   两个工人同一时候记录生产产品总数问题 1. 失效数据 可见性出现故障就是其它线程没有获取到改动后的状态,更直观的描写叙述就是其它线程获取到的数据是失效数据. 2. 非原子64位操作 3. 加锁与可见性 比如在一个变…
本章将介绍如何共享和发布对象,从而使他们能够安全地由多个线程同时访问.这两章合在一起就形成了构建线程安全类以及通过 java.util.concurrent 类库来构建开发并发应用程序的重要基础. 3.1 可见性 可见性是一种复杂的属性,因为可见性中的错误总是违背我们的直觉.为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制. 在下面的清单中 NoVisibility 说明了当多个线程在没有同步的情况下共享数据出现的错误.主线程启动读线程,然后将 number 设为 42,并将 rea…
一.什么是线程安全 当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步及在调用代码代码不必作其他的协调,这个类的行为仍然是正确的,那么称这个类是线程安全的. 内部锁 Java提供了强制性的内置锁机制:synchronized块.一个synchronized块有两个部分:锁对象的引用,以及这个锁保护的代码块.执行线程进入synchronized块之前会自动获得锁,无论通过正常控制路径退出还是从块中抛出异常,线程都在放弃对synchronized块的控制…
java并发程序和共享对象实用策略 在并发程序中使用和共享对象时,可以使用一些实用的策略,包括: 线程封闭 只读共享.共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它.共享的只读对象包括不可变对象和事实不可变对象 线程安全共享.线程安全地对象在器内部实现同步. 保护对象.被保护的对象只能通过持有特定的锁来方访问. 线程封闭 当访问共享的可变数据时,通常需要使用同步.一种避免使用同步的方式就是不共享数据.如果仅在单线程内访问数据,就不需要同步.这种技术被称为线程封闭,它是实现线程安全性…
2.线程的安全性 2.1什么是线程安全 在多个线程访问的时候,程序还能"正确",那就是线程安全的. 无状态(可以理解为没有字段的类)的对象一定是线程安全的. 2.2 原子性 典型的例子,多线程状态下的i++是不安全的.因为i++其实是分很多步骤实现的,多个线程的执行过程可能会相互混乱. 竞态条件(Race Conditions) 线程与线程之间需要依赖于执行顺序来保证执行结果的正确性.那么就会发生竞态条件.例如在A线程中设置一个值,然后通过另外一信号变量通知给另外一个线程来读.这种协调…
一.不变性 满足同步需求的还有一种方法是使用不可变对象(Immutable Object). 到眼下为止,我们介绍了很多与原子性和可见性相关的问题,比如得到失效数据.丢失更新操作或光查到某个对象处于不一致的状态等等,都与多线程视图同一时候訪问同一个可变的状态相关.假设对象的状态不会改变,那么这些问题与复杂性也就自然消失了. 假设某个对象在被创建后其状态就不能被改动,那么这个对象就被成为不可变对象.线程安全型是不可变对象的固有属性之中的一个,他们的不变性条件是由构造函数创建的,仅仅要他们的状态不改…
这章的主要内容是:如何共享和发布对象,从而使它们能够安全地由多个线程同时访问. 内存的可见性 确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化. 上面的程序中NoVisibility可能会持续循环下去,因为读线程可能永远都看不到ready的值.一种更奇怪的现象是NoVisibility可能会输出0,因为读线程可能看到了写入ready的值,但却没有看到之后写入number的值,这种现象被称为“重排序”.多线程之指令重排序 失效数据 简而言之就是在缺乏同步的程序中可能会读取到过期的数据…