Java并发随笔

1 什么时候需要考虑并发问题

      多线程环境下(好多人第一反应是访问量大,是因为访问量大的程序多线程居多,但是两者并不等价)

2 多线程可能产生的问题有哪些

    1.安全性(共同访问数据)

    2.活跃性(例如死锁)

    3.性能(多线程同步时会影响性能,线程的切换也会)

3 线程安全包括哪些方面

    1.对象的正确创建(不要在构造器中使this逸出)

    2.对象的安全发布

        1.不可变对象可以通过任意机制发布

        2.事实不可变对象必须通过安全的方式来发布

        3.可变对象必须通过安全的方式来发布,并且必须是线程安全的或者由某个锁保护起来

        注:不可变对象和实施部可变对象安全发布之后可以随意访问,可变对象的访问也需要是安全的,要么他本身负责在并发下的安全访问,即作为一个线程安全的对象被访问,或者由调用者来负责,此时需要文档说明该对象的访问方式。

4 如何解决并发问题

    1.不在线程间共享(线程封闭和ThreadLocal可以实现)

    2.将状态变量修改为不可变的变量(无状态对象一定时线程安全的)

    3.访问时使用同步

5 安全发布一个正确构造的对象的方法

   1.在静态初始化函数中初始化一个对象引用

   2.将对象的引用保存到volatile类型的域或者AtomicReferance对象中

   3.将对象引用保存到某个正确构造对象的final类型域中

   4.将对象引用保存到一个锁保护的域中(如:将对象放入一个线程安全的容器)

安全的发布与安全的访问要区别开来,安全发布保证的是你发布的对象的可见性,如线程A发布一个对象,如果不是安全的发布可能会导致访问该对象的线程B看到尚未创建完成的对象,我是将安全的发布理解为一个原子操作,并保证其可见性即可。但是安全发布的对象访问时是否需要同步取决于该对象是否可变。

今天先写这么多,这是随笔,以后再整理。

如有错误,恳请指正,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值