Java并发编程实战(第一天)

java并发编程实战(第一天)

第一章

  • 什么是线程安全:当多个线程同时访问某个类时,这个类始终表现出正确的行为,那么就成这个类时线程安全的。
  • 无状态类一定是线程安全的。
    • 有状态类:类中有成员变量,而且成员变量是可变的,比如Structs2的action。
    • 无状态类:类中没有成员变量,或者成员变量是不可变的,比如Structs1的action。
  • 原子性:像count++,++count这种操作都是非原子的使用是一定要注意线程安全的问题。在并发编程中,这种不恰当的时序而出现不正确的结果是一种非常重要的情况,他有一个正式的名字“静态条件”。
  • 内置锁(synchronized):不恰当的使用synchronized会导致性能的下降。
  • 重入:内置锁是可重入的,因为如果某个线程驶入获得一个已经由他自己只有的锁,那么这个请求会成功,“重入”以为这锁的操作粒度是“线程”,而不是“调用”。

对象的共享

  • 可见性:只要数据在多个线程上共享,那么就要正确的同步。
  • 加锁和可见性:加锁的含义不仅仅局限于互斥的行为,还包括内存的可见性,为了确保所有线程都能看到共享变量的最新值,所有执行写操作与读操作的线程都必须在同一个锁上同步。
  • volatile变量:仅当volatile变量能简化代码的实现以及对同步策略的验证时,才应该使用它。如果仅在验证正确性时,需要对可见性进行复杂的判断,就不要使用volatile。
  • 线程封闭:一种避免使用同步的方法就是不共享数据,如果仅在单线程内访问数据,就不需要同步,这种技术被称为线程封闭(Thread Confinement)。
  • 栈封闭:栈封闭是一种特例,在栈封闭中,只有通过局部变量才能够访问对象,对象被封闭到栈中(方法中)。
  • ThreadLocal类:维持线程封闭性的一种更规范的方式是使用ThreadLocal这个类,这个类是线程中的某个值与保存值的对象关联起来,ThreadLocal变量类似于局部变量,他能降低代码的可重用重性,并在类之间引入隐藏的耦合性,因此使用时要格外小心。
  • 不可变(不可变的对象一定是线程安全的):满足同步需求的另一种方法是使用不可变的对象。线程安全性是不可变对象的固有属性之一。虽然Java语言规范和Java内存模型中都没有给出不可变的对象的正式定义,当不可变对象不等于将对象中的所有域声明真final类型。
    • 当满足一下条件时,对象才是不可变的:
      • 当对象创建后,其状态就是不可改变的。
      • 对象的所有域都是final类型的。
      • 对象是正确创建的(对象在创建期间,this应用没有逸出)。
  • Fianl域:final类型的域是不能修改的(但如果fianl域所引用的对象是可变的,那么这些引用是可变的)。final域能确保初始化过程中的安全性,从而可以不受限制的访问不可变对象,并在共享这些对象是无须同步。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值