1.线程安全的定义

当多个线程访问某个类时,不管允许环境采用何种调度方式或者这些线程如何交替执行,这个类都能表现出正确的行为

如果一个类既不包含任何域,也不包含任何对其他类中域的引用。则它一定是无状态的对象,无状态对象一定是线程安全的

2.竞态条件

并发编程中,由于不恰当的执行时序导致不正确的结果。当某个计算结果的正确性取决于多线程交替执行时序时,就会发生竞态条件。

常见的竞态条件:

  • 先检查后执行。
  • 读取-修改-写入

3.复合操作

为了避免产生竞态条件,必须以原子的形式执行一组操作。

4.内置锁(监视器锁)

java提供了内置的原子性操作的锁机制:同步代码块(synchronize),它包含两部分,一个作为锁的对象引用。一个作为由这个锁保护的代码块。每个java对象都是自带一个监视器锁。线程进入获取锁,出来释放锁。

  • 4.1 重入

定义:当某个线程请求由其他线程持有的锁时,就会发生堵塞。但是内置锁是可以重入的,当该线程尝试或的锁是已经由自己持有的,那么该请求就会成功。重入意味着 锁的粗粒度是线程而非调用

如下代码,如果内置锁不可重入,下面的代码就会发生死锁。

public class SynchronizeTest extends superSynchronize {

    @Override
public synchronized void superMethod1() {
System.out.println("synchronized test ");
super.superMethod1();
} public static void main(String[] args) {
new SynchronizeTest().superMethod1();
}
} class superSynchronize { public synchronized void superMethod1() {
System.out.println("superMethod1 sybchronized");
} }

最新文章

  1. Mac 热键大全
  2. Zookeeper分布式集群搭建
  3. javascript要不要用来处理业务逻辑
  4. git中ssh配置方法
  5. UVa 11014 (莫比乌斯反演) Make a Crystal
  6. PHP Java
  7. hdu 4930 Fighting the Landlords--2014 Multi-University Training Contest 6
  8. mxnet:结合R与GPU加速深度学习
  9. 打开CSDN论坛出现403
  10. 利用RTL2832u电视棒芯片追踪民航飞机轨迹
  11. 判断客户端是IOS还是Android
  12. mybatis入门篇:Mybatis注解方式的基本用法
  13. 061 SparkStream数据接收原理
  14. 00-JAVA语法基础--动手动脑
  15. D6差分及树上差分
  16. MySQL学习笔记2(多表操作)
  17. MR室内室外用户区分
  18. python-----多线程、线程池、进程池
  19. Python——列表深浅拷贝
  20. 反射已经"Out",动态编译才能"Hold"住

热门文章

  1. js控制select选中显示不同表单内容
  2. 出门旅行(tour)
  3. Python——字典
  4. 如何在RedHat 7.0系统中安装mysql 5.7.22
  5. gzip,bzip2,xz压缩工具
  6. 【PHP项目】$_SEVER详解
  7. Linux编译移植Qt5的环境_Xillinx的ZYNQ平台
  8. [BZOJ2734][HNOI2012] 集合选数(状态压缩+思维)
  9. 25-IHostEnvironment和 IApplicationLifetime介绍
  10. 菜鸟学Linux - Tarball安装的一般步骤