java并发实战-基础知识
1.线程安全
共享:变量可以由多个线程同时访问.可变:变量值在生命周期内可以变化.
当多个线程访问某个类时,这个类始终都能表现出正确的行为,称这个类是线程安全的.
无状态对象是线程安全的.
2.原子性
竞态条件:由于不恰当的执行时序而出现不正确的结果,是一种非常重要的情况.
a.先检查后执行是一种常见的延迟初始化操作.目的是:将对象的初始化操作推迟到实际被使用时才执行.同时要确保只被初始化一次.
3.复合操作
避免竞态条件问题,必须在某线程修改该变量时,通过某种方式防止其让线程使用这个变量.从而确保其他线程只能在修改操作完成之前或之后读取和修改状态,而不是在修改过程.有两个操作A和B,当一个线程执行的时候要么执行完,要么不执行.那A和B对彼此来说就是原子性的,
4.加锁操作
要保持状态一致性就需要在单个原子操作中更新所有相关的状态变量.
5.重入
重入获取锁的操作粒度是线程,而不是调用.重入的一种实现方式是:为每个锁关联一个获取计数和一个所有者线程.当计数值为0,当计数值为0,认为这个锁没有被任何线程持有.
6.用锁来保护状态
每个共享的和可变的变量都应该只由一个锁来保护,从而使维护人员知道是哪个锁.
在简单性和性能之间存在着相互制约因素,当实现某个同步策略时,一定不要盲目为了性能而牺牲简单性.
当执行时间较长或者无法完成的操作(如网络I/O,或控制台I/O)一定不要持有锁.
java并发实战-基础知识的更多相关文章
- Java并发(基础知识)—— Executor框架及线程池
在Java并发(基础知识)—— 创建.运行以及停止一个线程中讲解了两种创建线程的方式:直接继承Thread类以及实现Runnable接口并赋给Thread,这两种创建线程的方式在线程比较少的时候是没有 ...
- Java并发(基础知识)—— 阻塞队列和生产者消费者模式
1.阻塞队列 Blocki ...
- 多线程(一)java并发编程基础知识
线程的应用 如何应用多线程 在 Java 中,有多种方式来实现多线程.继承 Thread 类.实现 Runnable 接口.使用 ExecutorService.Callable.Future 实现带 ...
- Java并发(基础知识)—— 创建、运行以及停止一个线程
在计算机世界,当人们谈到并发时,它的意思是一系列的任务在计算机中同时执行.如果计算机有多个处理器或者多核处理器,那么这个同时性是真实发生的:如果计算机只有一个核心处理器那么就只是表面现象. 现代所有的 ...
- Java并发(基础知识)——显示锁和同步工具类
显示锁 Lock接口是Java ...
- Java并发(基础知识)—— Java中断机制
上文讲解了Java线程的创建.启动以及停止,在讲到停止线程时说到了Java中断,Java中断是停止线程的一种协作机制,本文打算对Java中断机制进行详细讲解. 在网上搜索Java中断机制,发现两篇好文 ...
- 【Java虚拟机4】Java内存模型(硬件层面的并发优化基础知识--缓存一致性问题)
前言 今天学习了Java内存模型第一课的视频,讲了硬件层面的知识,还是和大学时一样,醍醐灌顶.老师讲得太好了. Java内存模型,感觉以前学得比较抽象.很繁杂,抽象. 这次试着系统一点跟着2个老师学习 ...
- Java面试题-基础知识
参考文章:Java面试题-基础知识 基础能力 什么是值传递和引用传递 线程状态有哪些,它们之间是如何转换的 进程与线程的区别,进程间如何通讯,线程间如何通讯? HashMap的数据结构是什么?如何实现 ...
- 并发-Java并发编程基础
Java并发编程基础 并发 在计算机科学中,并发是指将一个程序,算法划分为若干个逻辑组成部分,这些部分可以以任何顺序进行执行,但与最终顺序执行的结果一致.并发可以在多核操作系统上显著的提高程序运行速度 ...
随机推荐
- Java线程基础(二)
今天上午考完了计算机二级,也算卸掉了一个大包袱吧,希望能过!(其实也就考着玩的,不来点考试就要发霉了) 好了,趁着难得的考后休息时间我就接着上一次没写完的继续更新吧. 上一篇文章——>Java核 ...
- cookie的认识
cookie 概念和术语cookie,字面意思是“饼干”,源自魔术cookie(魔术cookie),这种技术已经在80年代的UNIX环境中已知并且通常用于在服务器上实现客户端的识别机制,例如例如X W ...
- SQL Server Management Studio 执行超大脚本文件
SQL Server Management Studio 执行超大脚本文件 启动cmd.exe , cd 到C:\Program Files (x86)\Microsoft SQL Server\11 ...
- 将vmware虚拟机转换成qcow2格式的方法
将vmware虚拟机转换成qcow2格式的方法 http://blog.51cto.com/13570993/2074071 关于qemu安装出现的问题 1.配置qemu是出现can't find p ...
- RFS常见问题
一.DatabaseLibrary 库遇到的问题:1,连接mysql库,查询语句带有中文,报FAIL UnicodeEncodeError: 'latin-1' codec can't encode ...
- 【搬运工】修改mysql数据库的时区
转载:https://blog.csdn.net/huangyuehong914/article/details/81742039 --------------------- ------------ ...
- Gradle 依赖管理
依赖管理(在 build.gradle 中): 1.定义依赖仓库(repositories): Gradle 要求至少定义一个依赖仓库,依赖仓库可以是文件系统,也可以是中心服务器.最常用的是 jcen ...
- Python 开发 项目《外星人入侵》
2019-02-05 本篇心路历程: 本篇是打算记录自己的第一个python项目,也是众人皆知的<外星人入侵项目>,本项目大概500多行.趁着寒假,大概耗时3天吧,把完整代码敲了出来,当然 ...
- node中redis重连
项目node中用到redis ,做了的moudle,但是有个问题,两台redis,一台挂了,redis能自动切换,我的项目却不会自动重连: 查了资料,redis本身是实现了重连机制啊,为什么不自动重连 ...
- DAY 17常用模块
一.时间模块:time 1.时间戳:time.time() # 可以作为数据的唯一标识 print(time.time) # 1554878849.8452318 2.延迟线程的运行:time.sle ...