并发本身有两个概念:1.互斥性;2.可见性;

先来说一下可见性,就是让共享的变量在进程间可以及时获得最新版本的数据;这里比较简单的方式是为可能被并发修改的全局变量添加上volatile关键字;volatile关键作用根据我查找的用途,有两方面:

  1. 在c++中,它的寓意是通知编译器对于该字段处理取消优化,强制每次都是内存中取值;优化的概念是编译器有的时候会自作聪明的把一些变量的复制过程简化,比如如果对于一个值连续付了两次值,那么将会被优化为只记录最后一次;对于单线程而言这种处理没有问题,但是对于多线程而言,结果就是未知的(此句话有待考证);
  2. 第二个则是强制每次取值都是从内存取值,否则系统处理会尝试首先从寄存器取值;

Volatile有他的局限性,比如对于i++这类多步骤处理,他就无法保证在取值和+1过程是原子的,所以这种情况下就需要互斥锁synchronize锁。

Synchronize锁需要注意一点,就是保证锁范围尽量少,尽快释放锁;在加锁的代码段尽量不要调用外部函数,因为外部函数不可控,还很容易引发死锁;

尽量多使用java内部封装的多线程工具,而不要使用wait-notify模式,但是如果是使用了,要保证wait是防止在while函数体里面,因为对于notify/notifyAll的调用你无法保证意图以及准确性;while函数体可以附加上条件检验;所以即使notify错了,因为附加条件不通过仍然会是等待线程处于等待状态;以及尽量少的直接使用Thread,而是使用Executor Framework封装的类以及Task对象;

不要使用Thread.yield以及线程池优先级;后者的作用仅仅是将控制权换回了线程调度器,后者不具备可移植性,如果发现了多线程问题尽量不要使用这两种方式。对于Thread.yield可以使用thread.sleep(1)来替代( 不要使用thread.sleep(0),它代表立即返回)。至于ThreadGroup就彻底放弃吧,没有什么意义的对象,而且还不保证线程安全性。

 

 

 

 

Effective Java之并发的更多相关文章

  1. Effective java -- 9 并发/序列化

    关于同步的问题,想弄明白java,同步不会是不行的.这不书弄完后还会从<java并发编程实战>和<java并发编程的艺术>选一本或者都看. 第六十六条:同步访问共享的可变数据说 ...

  2. 《Effective Java》 学习笔记 —— 并发

    <Effective Java>第二版学习笔记之并发编程. 第66条 同步访问共享的可变数据 * 关键字synchronized可以保证在同一时刻只有一个线程可以执行某个方法或代码块. * ...

  3. 《Effective java》-----读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础.Spring研究.java并 ...

  4. effective java 读后感

    think in java  , effective java  这两本书一直都在java的生态圈中经久不衰.本来想着先翻过 think in java 这本大山,但是读到一半就放弃了.过长的篇幅,让 ...

  5. Effective java读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...

  6. [Effective Java]第八章 通用程序设计

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. Effective Java通俗理解(持续更新)

    这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...

  8. Effective Java通俗理解(下)

    Effective Java通俗理解(上) 第31条:用实例域代替序数 枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用 ...

  9. 5. Effective Java 第三版——使用依赖注入取代硬连接资源

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

随机推荐

  1. Android 颜色渲染(六) RadialGradient 环形渲染

    Android 颜色处理(六) RadialGradient 环形渲染 public RadialGradient(float x, float y, float radius, int[] colo ...

  2. 启动列表的activity

    每学一个知识点就要重新创建一个项目,感觉那样太繁琐了,特别是android studio开发,没创建一个项目都会重新打开一个窗口 所以我就在那想,何不有一个功能列表,点击每一个列表项的时候就跳转到那个 ...

  3. 原创C# 枚举 多状态 操作

    C# 中枚举类型是一种值类型,目前(vs2012)还不能用于泛型. 此类型最多的用处是标识一组相同类型的状态量或常量,比如: 状态量 示例一 [Flags] public enum Connectio ...

  4. google DNS

    DNS 8.8.8.8 然后 C:\Windows\System32\drivers\etc\hosts 108.111.1.1  www.s.com

  5. Android_Intent_passObject

    方法4. 把基本的数据类型封装到一个对象中,然后通过intent传递该对象需要考虑对Person对象进行序列化 MainActivity: package com.example.day06_acti ...

  6. Nginx高性能服务器安装、配置、运维 (3) —— Nginx配置详解

    四.Nginx 配置详解 YUM方式安装的Nginx默认配置文件放在/etc/nginx目录下,使用Vim编辑/etc/nginx/nginx.conf: ---------------------- ...

  7. TCL 双引号和花括号的区别

    用了很一段时间的Modelsim,用TCL脚本仿真,开始注意起来它,看了些资料,有一个问题始终让我很困惑,那就是花括号 的用法,今天Google了一下,觉得有一点豁然了,记录一下.为了不让自己的翻译影 ...

  8. 鸭子类型duck typing(动态)

    在程序设计中,鸭子类型(duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定.这个概念的名字来源于由Ja ...

  9. CodeFile与CodeBehind的区别

    引自:http://blog.163.com/wentworth0119@126/blog/static/17321924220122852720103/ asp.net发布项目之后 存在" ...

  10. 16Aspx.com源码2014年7月详细

            Web电子商务网(三层)V2.0源码 2014-07-31   [VS2010] 源码介绍: Web电子商务网(三层)V2.0源码 源码描述: 一.源码特点     采用三层架构开发, ...