Java并发编程实战读书笔记(1)

本文探讨了Java中的线程安全问题,包括无状态对象的线程安全性、线程同步、内置锁的可重入性以及AtomicLong等线程安全类的使用。强调了在多线程环境下,对可变数据的保护以及volatile关键字的重要性。同时指出,只有被多个线程共享的可变数据才需要同步措施,并举例说明了不恰当的同步可能导致的死锁问题。
摘要由CSDN通过智能技术生成

1、无状态对象一定是线程安全的。因为无状态的对象不包含任何变量或者其他类的引用。

2、在某线程修改某变量的时候,需要通过某种方式,比如加锁,来防止其他线程使用该变量。

3、在java.util.concurrent包含了一些县城安全的对象,比如AtomicLong.在实际情况中,尽可能低使用现有的线程安全对象。避免重复造轮子。

4、每个java对象都有一个实现同步的锁,被称为内置锁,它是可以重入的,也就是说一个线程试图获取一个已经由他自己持有的锁,那么这个请求就会成功。关于重入锁,可以简单的阅读博主的Java线程拾遗(可重入锁),如果内置锁是不可重入的会发生什么现象呢?如果子类Child 重写了Parent的一个方法m(),并在该方法中调用super.m(),那么Child 的m()方法必然会发生死锁。

Class Child extends Parent{
  @Override
  public synchronized void m(){
     println("this is child m invoke").
     super.m();
  }
}

5、某线程在获取对象的锁之后,只能阻止其他线程获得同一个锁,但是并不能阻止其他线程访问该对象。

6、只有被多个线程同时访问的可变数据才需要通过锁来保护。

7、synchronized 的作用:实现原子性、确定临界区、确保内存可见性。内存可见性也就是说:某个线程修改了对象状态之后,其他线程能够看到发生的状态变化。也就是说加锁的含义不仅仅局限于互斥行为,为了确保所有线程都能看到共享变量的最新值,所有执行读或者写操作的线程都必须在同一个锁上同步。

8、在多线程中使用共享且可变的long或者double等类型的变量也是不安全的,除非用volatile声明或者使用锁保护起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭梧悠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值