java多线程(2) ----- 对象及变量的并发访问(下)

(欢迎关注微信公众号:深入Java底层)

1.  synchronized对象监视器为Class时的使用

synchronized关键字加到static静态方法上是给Class类上锁,而synchronized关键字加到非static静态方法上是给对象上锁。

对象锁和Class锁属于不同的锁,是异步的;而Class锁可以对类所有对象实例起作用,换句话说,类中静态同步synchronized方法与synchronized(class)是同步的。

2.  非线程安全是如何出现的

   在多个线程对用一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”,也就出现了“非线程安全”。“非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果也就是“线程安全”的了。

3.  关键字volatile的主要作用

关键字volatile的主要作用是使变量在多个线程间可见,强制从公共堆栈(共享内存)中取得变量的值,而不是从线程私有数据栈(私有内存)中取得变量的值。

4.  关键字volatile与synchronized的区别及使用情况

synchronized和volatile进行一下比较

·关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。

·多线程访问volatile不会发生阻塞,而synchronized会出现阻塞。

·volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也间接保证可见性,因为它会将私有内存和公共内存中的数据做同步,保证进入同步方法或同步代码代码块的每一个线程,都看到由同一个锁保护之前所有的修改效果。

·再次重申一下,关键字volatile解决的是变量在多个线程之间的可见性;而synchronized关键字解决的是多个线程之间访问资源的同步性。

线程安全包含原子性和可见性两个方面,Java的同步机制都是围绕这两个方面来确保线程安全的。

5.  volatile非原子性的特性

关键字volatile虽然增加了实例变量在多个线程之间的可见性(volatile强制对数据的读写及时影响到主内存的,从而多线程读取共享变量时可以获得最新的值使用,但它却不具备同步性,那么也就不具备原子性,所以多个线程访问一个实例变量还是需要加锁同步

6.  使用原子类进行i++操作

    除了在i++操作时使用synchronized关键字实现同步外,还可以使用AtomicInteger原子类进行实现。

原子操作是不能分割的整体,没有其他线程能够中断或检查正在原子操作中的变量。一个原子(atomic)类型就是一个原子操作可用的类型,它可以在没有锁的情况下做到线程安全(thread-safe)。

7.  原子类也并不完全安全

    原子类在具有有逻辑性的情况下输出结果也具有随机性。原子类的方法是原子的,但方法和方法之间的调用却不是原子的。解决这样的问题必须要用同步。

(欢迎关注微信公众号:深入Java底层)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值