Effective java 第十章 并发 同步访问共享的可变数据 读书笔记

并发

66.同步访问共享的可变数据

关键字synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块。

如果没有同步,一个线程的变化就不能被其他线程看到。同步不仅可以阻止一个线程看到对象处于不一致的状态之中,它还可以保证进入同步方法或者同步代码块的每个线程,都看到由一个锁保护的之前所有的修改效果。

java语言规范保证读写一个变量是原子的,除非这个变量的类型为long或者double。意味着读取一个非long或者double类型的变量,可以保证返回的值是某个线程保存在该变量中的,即使多个线程在没有同步的情况下并发地修改这个变量也是如此。

java语言规范中的内存模型,它规定了一个线程所做的变化何时以及如何变成对其他线程可见。

valatile修饰符不执行互斥访问,但它可以保证任何一个线程在读取该域的时候都将看到最近刚刚被写入的值。

增量操作符(++)不是原子的。分两个操作,先读值,再写入一个新值。

可以加上synchronized修饰符。如此就可以去掉volatile修饰符。

最佳实践是,使用类AtimicLong,比synchronized执行的更好

当多个线程共享可变数据的时候,每个读或者写数据的线程都必须执行同步。

未能同步共享可变数据会造成程序的活性失败和安全性失败。这样的失败是最难以调试的。

如果线程之间的交互通信,而不需要互斥,volatile修师傅就是一种可以接受的同步形式,但要正确地使用它可能需要一些技巧。

时间: 2024-12-21 13:46:32

Effective java 第十章 并发 同步访问共享的可变数据 读书笔记的相关文章

EFFECTIVE JAVA 第十章 并发

EFFECTIVE  JAVA  第十章  并发 66.同步访问共享的可变数据 *java语言规范保证读或写一个变量是原子的(可以保证返回的值是某个线程保存在该变量中的),除非这个变量的类型为long或double.(但并不保证一个线程写入的值对于另一个线程是可见) *synchronized修饰方法.synchronized代码块可以实现同步 *volatile修饰的变量只保证读取的是主存里最新的值而不是内存中该值的拷贝,使用volatile变量必须遵循(即变量真正独立于其他变量和自己以前的值

Effective java 第十章 并发 避免过度同步 读书笔记

避免过度同步 为了避免活性失败和安全性失败,再一个被同步的方法或者代码快中,永远不要放弃对客户端的控制. 因为外来的,属于不可控的 将外来方法调用移出同步的代码快. 建立快照 使用并发集合,CopyOnWriteArayList.属于ArrayList的变体,通过拷贝整个底层数组,在这里实现所有的写操作.由于内部数据用于不改动,因此迭代不需要锁定,速度也非常快.但如果大量使用,性能将大受影响. 在同步区域之外被调用的外来方法被称作开放调用. 除了可以避免思索之外,开放调用还可以极大地增加并发性.

《Effective C++》第3章 资源管理(2)-读书笔记

章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(2)-读书笔记 <Effective C++>第3章 资源管理(1)-读书笔记 <Effective C++>第3章 资源管理(2)-读书笔记 <Effective C++>第8章 定制new和delete-读书笔记 条款1

《Effective C++》第3章 资源管理(1)-读书笔记

章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(2)-读书笔记 <Effective C++>第3章 资源管理(1)-读书笔记 <Effective C++>第8章 定制new和delete-读书笔记 内存只是你必须管理的众多资源之一.其他常见的资源还包括文件描述器(file des

C#和Java之比较(并发同步概述)

计算机的高速发展,在多核技术上要远远快于提升单核的计算能力.因而设计并发的程序成为提高软件性能的一大利器. 并发的程序虽然可以有效利用硬件资源,但同时也会增加程序设计的难度,其首要解决的就是同步的问题. 同步问题归纳而言就是要解决两个问题:活性失败(liveness failure)和 安全性失败(safety failture). 活性失败是指,线程A操作的变量c,在线程B中要访问的时候,不是最新的线程A操作赋值后的值.产生此类问题的原因在于现代CPU多采用了高速缓存,高速缓存变成了CPU和内

Java虚拟机对锁优化所做的努力(读书笔记)

锁偏向 是一种加锁操作的优化手段,他的核心思想是:如果一个线程获得了锁,那么就进入偏向模式,当这个线程再次请求锁时,无须在做任何同步操作,因此在几乎没有锁竞争的场合,偏向锁是比较好的优化效果,因为连续多次极有可能是同一个线程请求同一个相同的锁,对于锁竞争比较激烈的场合,其效果不佳,因为竞争激烈的场合,最有可能的情况是每次都是不同的线程来请求相同的锁,这样偏向模式就会失效,使用Java虚拟机参数-XX:+UseBiasedLocking可以开启偏向锁, 轻量级锁 如果偏向锁失败,虚拟机并不会立即挂

第十章、嵌入式Linux的调试技术 读书笔记

蜂鸣器是s3c6410开发板上带的一个硬件设备,可以通过向寄存器写入特定的值来控制蜂鸣器发出尖叫声. 在前面的章节编写了两个完整的linux驱动:word_count驱动和led驱动,两个有一共同点就是都有一个源代码文件组成. 代码重用分为静态和动态两种.即将需要重要的代码使用者放在一起进行编译,最终生成一个可执行的文件或程序库. 蜂鸣器与led类似,也是s3c6410开发板上自带的一个简单的硬件.如果打开蜂鸣器,开发板会发出类似蜂鸣的尖叫声,关闭蜂鸣器则会停止尖叫声. 如果编写的linux驱动

《java程序员职场全攻略》读书笔记

专业领域很重要开发财务软件对数据库的操作用到增删改查,是不合理的:财务软件是严谨的,对于错账处理,是用蓝字冲销和红字冲销两种方式对付错账,简单的说,如果一笔账记错了,则先用一个红字冲销冲掉错误账,再用一个蓝字冲销记录正确的账目即可.肯定是不存在把账目调出来修改或删除的,所以开发财务软件的时候一定要了解相关领域. 软件的操作方式火车票的订票人员大多采用键盘操作,高级的游戏玩家也是键盘高手,很多银行.超市等地方对工作效率要求很高,所以在设计特殊行业软件开发的时候应该考虑快捷键操作. 不要认为客户不懂

[读书笔记]《Effective Java》第10章并发

第66条:同步访问共享的可变数据 同步的意义. 正确地使用同步可以保证没有任何方法会看到对象处于不一致的状态中. 进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护的之前所有的修改效果. Java语言规范保证读或者写一个变量是原子的,除非这个变量的类型为long或者double. 对于原子数据的读取,Java语言规范并不保证一个线程写入的值对于另一个线程将是可见的. 对于共享的数据,即使数据是原子可读写的,也要使用同步. 活动性失败:因为JVM的优化,部分代码无法执行. 1 /** 2