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并发编程基础 并发 在计算机科学中,并发是指将一个程序,算法划分为若干个逻辑组成部分,这些部分可以以任何顺序进行执行,但与最终顺序执行的结果一致.并发可以在多核操作系统上显著的提高程序运行速度 ...
随机推荐
- 用AtomicStampedReference解决ABA问题
在运用CAS做Lock-Free操作中有一个经典的ABA问题: 线程1准备用CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,又由C替换为A,然后线程1执行CAS时发现变量的值仍然 ...
- centos7 fortune+cowsay+lolcat美化初始终端
前序 fortune+cowsay+lolcat效果图(每次打开新的终端的时候, 显示名言) fortune 提供我的rpm包, fortune+依赖 安装它们 rpm -ivh *.rpm 调配中文 ...
- 常用sql语句总结(二)(更新数据,序列,创建数据表,约束,注释)
常用sql语句总结(二)(更新数据,序列,创建数据表,约束,注释) 一. 增 INSERT INTO 数据表(字段,字段,-) VALUES(值,值-); INSERT INTO emp(empno, ...
- SQL中IN与EXISTS的区别
1.IN子句中的子查询只能返回一个字段,不允许返回多个字段,而EXISTS可以返回多个字段 2.IN返回的是某字段的值,而EXISTS返回的则是True或False,EXISTS子句存在符合条件的结果 ...
- js中call()的用法
A.call(B,x,y) 1`改变函数A的this指向,使之指向B; 2` 把A函数放到B中运行,x和y是A函数的参数. //父类 Person function Person() { ...
- Error creating bean
问题原因 Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: bookinfo is not mapped,sql语句中的表 ...
- SQL 删除数据 的所有用法
https://blog.51cto.com/13588598/2066335 1.使用 delete 语句删除表中的数据:语法:delete from <表名> [where <删 ...
- 说说Python中的闭包
Python中的闭包不是一个一说就能明白的概念,但是随着你往学习的深入,无论如何你都需要去了解这么一个东西. 闭包的概念 我们尝试从概念上去理解一下闭包. 在一些语言中,在函数中可以(嵌套)定义另一个 ...
- IDEA ----Apachemaven连接私服,mavenWed工程 、以及Tomcat配置和项目的部署
1.Apachemaven连接私服, 首相先下载Apachemaven文件(压缩包和解压后的) 打开maven下的conf文件下的settin.xml, 配置setting.xml文件 其他信息随便写 ...
- Vue-admin工作整理(五):守卫导航
一.作用: 它可以帮我们在路由发生跳转,到导航结束的时间内,做一些相应的逻辑处理,分为:全局守卫,和专项守卫 1.全局收尾: (a).前置守卫:router.beforeEach(to,from,ne ...