Java多线程中线程安全与锁问题
2017-07-03 14:21
561 查看
线程安全
无状态的对象一定是线程安全的。大多数Servlet都是无状态的,从而极大地降低了实现Servlet线程安全性的复杂性。只有当Servlet在处理请求时需要保存一些信息时,才可能会产生线程安全问题。
要保持状态的一致性
4000
,就需要在单个原子操作中更新所有相关的状态变量。
并发环境中的原子性与事务应用程序中的原子性有着相同的含义—一组语句作为一个不可分割的单元被执行。
对于可能被多个线程同时访问的可变状态变量,在访问它的时候需要持有同一把锁,在这种情况下,称状态变量是由这个锁保护的。
锁问题
一个对象里面如果有多个synchronized方法,某一时刻内,只要一个线程去调用其中的一个synchronized方法了,其他的线程都只能等待,换句话说,某一个时刻内,只能有唯一一个线程去访问这些synchronized方法锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的synchronized方法。普通方法和同步锁无关
所有的非静态同步方法用的都是同一把锁—实例对象本身(如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放后才能获取锁,别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的是不同的锁,所以不需要等待该实例对象已获取锁的非静态同步方法释放锁就可以获取他们自己的锁)
所有的静态同步方法用的也是同一把锁—类对象本身(静态同步方法与非静态同步方法之间不会有竞态条件,但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁,而不管是同一个实例对象的静态同步方法之间,还是不同的实例对象的静态同步方法之间,只要它们是一个类的实例对象!)
相关文章推荐
- 设计模式——单例模式(Java)——考虑多线程环境下的线程安全问题
- Java笔记3 多线程<1>线程概述、多线程的创建、多线程的安全问题、静态同步函数的锁、死锁
- 静态变量、实例变量、局部变量在多线程环境下的线程安全问题 java 多线程
- 黑马程序员——Java多线程之线程安全问题
- java多线程学习之线程安全问题
- Java 中的多线程-两种创建方式,定时器的应用,线程的安全问题可以用银行转账来说明
- java多线程(1):线程的创建和多线程的安全问题
- Java多线程设计(三)线程安全问题
- (47)Java学习笔记——多线程 / 线程的安全问题
- java 多线程(线程间通信-解决安全问题)
- JAVA基础再回首(二十四)——多线程的概述、实现方式、线程控制、生命周期、多线程程序练习、安全问题的解决
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition
- 黑马程序员--Java基础--多线程安全问题
- 黑马程序员——java中两个线程对同一个数据做不同操作的安全问题
- Java基础_线程_多线程_生产者消费者问题
- java线程安全问题之静态变量、实例变量、局部变量
- java多线程学习一线程安全之内存、synchronized、volatile
- Java多线程技术初识——4. 多线程安全问题的解决
- JAVA中关于线程通信安全问题
- 关于Java语言中的线程安全问题