1. 线程间的通信机制
线程之间通信机制有两种: 共享内存、消息传递。
 
2. Java并发
Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式执行,通信的过程对于程序员来说是完全透明的。
 
3. 同步原语
有三个同步原语:Synchronized、volatile和final。
Synchronized 的主要的含义是对指定的对象、方法、类 进行加锁和解锁的操作。保证当前只有一个线程进行访问。
Volatile 的主要的含义是对指定的变量在数据的读取和更新时都从共享内存中进行操作,抛弃了本地内存,这样的话能够保证对数据的修改是对其他的线程可见的。
final 主要是限制了在编译的过程中的重排序,需要保证的是针对此数据的读操作必须要在初始化之后。
 
Volatile更适用于修饰变量,属于轻量级别的锁。

特点是:在修饰的变量值是控制了其写的锁,其他的线程还是能够读取数据的。
 
Synchronized 是一种稍微比较重量级的锁。 
Synchronized 中的每一个对象都可以作为锁。具体的表现形式如下:(锁都是对象)
1.  对于普通的同步方法,锁是当前对象实例
2.  对于静态同步方法,锁是当前类的class对象
3.  对于同步方法块,锁是Synchronized括号里配置的对象
 
双重检测锁定也需要注意适当的使用Synchronized、volatile这两个同步原语,如果不用这两个可能会导致线程在生成对象的时候可能因为编译时的重排序出现内容的错误。 相关文章: Java 设计模式 —— 单例模式
 
4. Java实现原子操作
Java中可以使用锁和循环CAS的方式来实现原子操作:
private void safeCount(){
for(;;) {
int i = atomicI.get();
boolean suc = atomicI.compareAndSet(i, i++);
if (suc) {
break;
}
}
}
但是原子操作可能会有三大问题:
①.ABA问题
之前的Java原子操作存在的问题就是变量值的值改回来之后,不知道是否改变过,需要加版本控制。 但是在Java 1.5之后,此问题得到了解决,也就会说目前不存在ABA问题了
②.循环时间长开销大
如果执行的操作长时间执行不成功,会给CPU带来非常大的执行开销。
③.只能保证一个共享变量的原子操作
目前针对此问题的解决办法就是讲多个共享变量综合为一个。
 

多线程的通信和同步(Java并发编程的艺术--笔记)的更多相关文章

  1. Java并发编程的艺术笔记(七)——CountDownLatch、CyclicBarrier详解

    一.等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作,像加强版的join.(t.join()是等待t线程完成) 例: (1)开启多个线程 ...

  2. Java并发编程的艺术笔记(五)——Java中的锁

    一.Lock接口的几个功能: 显示的获取和释放锁 尝试非阻塞的获取锁 能被中断的获取锁 超时获取锁 使用方式: Lock lock = new ReentrantLock(); lock.lock() ...

  3. Java并发编程的艺术笔记(一)——volatile和syncronized关键字

    一.线程间的通信 volatile和syncronized关键字 volatile 修饰变量,告知任何对该变量的访问必须从共享内存获取,对它的改变必须同步刷新至共享内存,由此保证可见性. syncro ...

  4. Java并发编程的艺术· 笔记(1)

    目录 1.volatile的原理 2.Synchonized 3.无锁-偏向锁-轻量级锁-重量级锁 4.Java实现原子操作 1.volatile的原理 如何保持可见性: 1)将当前处理器缓存行的数据 ...

  5. Java并发编程的艺术笔记(九)——FutureTask详解

    FutureTask是一种可以取消的异步的计算任务.它的计算是通过Callable实现的,多用于耗时的计算. 一.FutureTask的三种状态 二.get()和cancel()执行示意 三.使用 一 ...

  6. Java并发编程的艺术笔记(六)——HashMap、ConcurentHashMap的原理与实现

    一.线程不安全的HashMap 多线程环境下,使用HashMap进行put操作会引起死循环(jdk1.7 Entry链表形成环形数据结构),导致CPU利用率接近100%. 结构:数组 table[]+ ...

  7. Java并发编程的艺术笔记(三)——Thread.join()

    t.join()方法只会使主线程进入等待池并等待t线程执行完毕后才会被唤醒.并不影响同一时刻处在运行状态的其他线程.它能够使得t.join()中的t优先执行,当t执行完后才会执行其他线程.能够使得线程 ...

  8. Java并发编程的艺术笔记(二)——wait/notify机制

    一.概述 一个线程修改了一个对象的值,另一个线程感知到变化从而做出相应的操作.前者是生产者,后者是消费者. 等待/通知机制,是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个线程B调用 ...

  9. Java并发编程的艺术笔记(十)——Semaphore详解

    作用:控制同时访问某个特定资源的线程数量,用在流量控制.

随机推荐

  1. 【XSS】延长 XSS 生命期

    XSS 的本质仍是一段脚本.和其他文档元素一样,页面关了一切都销毁.除非能将脚本蔓延到页面以外的地方,那样才能获得更长的生命力. 庆幸的是,从 DOM 诞生的那一天起,就已为我们准备了这个特殊的功能, ...

  2. ABP文档 - 异常处理

    文档目录 本节内容: 简介 启用错误处理 非AJAX请求 显示异常 UserFriendlyException Error 模型 AJAX 请求 异常事件 简介 这个文档针对Asp.net Mvc和W ...

  3. sonn_game网站开发01:写在最前面

    之前做的个人博客项目,日向博客现在已经进入后期完善阶段了.是时候开始打造一个新坑了. 然而改造个什么坑呢?构思了好几天,想了好多方案,都觉得没啥动手欲望.因为,我想做的是那种,自己能用得上,而且有一定 ...

  4. In-Memory:内存优化表 DMV

    在内存优化表的DMV中,有两个对象ID(Object ID): xtp_object_id 是内部的内存优化表(Internal Memory-Optimized Table)的ID,在对象的整个生命 ...

  5. js从数组中随机取出不同的元素

    前言 上午处理个需求需要从一个总数组中随机取出不同的元素.共使用两个方法.第一种方法较常规,经测试有bug,数据量大以后随机几次返回的对象直接是function而不是object. 当然简单数据类型应 ...

  6. [EasyUI美化换肤]更换EasyUi图标

    前言 本篇文章主要是记录一些换EasyUI皮肤的过程,备忘.也欢迎美工大神各路UI给点好意见,EasyUI我就不介绍了,自行百度吧..(So..所以别问我是不是响应式..本身EasyUI就不是响应式. ...

  7. C# 泛型

    C# 泛型 1.定义泛型类 在类定义中包含尖括号语法,即可创建泛型类: class MyGenericClass<T> { //Add code } 其中T可以遵循C#命名规则的任意字符. ...

  8. EC笔记:第4部分:22、所有成员都应该是private的

    EC笔记:第4部分:22.所有成员都应该是private的 更简单的访问 用户不用记得什么时候该带上括号,什么时候不用带上括号(因为很确定的就要带上括号) 访问限制 对于public的成员变量,我们可 ...

  9. spring的BeanFactory加载过程

    ApplicationContext spring = new ClassPathXmlApplicationContext("classpath*:spring/applicationCo ...

  10. 【JS基础】正则表达式

    正则表达式的() [] {}有不同的意思. () 是为了提取匹配的字符串.表达式中有几个()就有几个相应的匹配字符串. (\s*)表示连续空格的字符串. []是定义匹配的字符范围.比如 [a-zA-Z ...