synchronized与lock的区别,volatile关键字总结

1.synchronized与lock的区别

  • synchronized是关键字属于JVM层面,lock是类
  • synchronized并不需要手动释放,不可中断,是一个非公平锁,只能全部唤醒或者随机唤醒
  • lock需要lock()和unlock()方法配合try/finally使用,同时它是一个可中断的可重入锁,默认是非公平锁,但是可以设为公平锁,同时可以条件唤醒
  • jdk1.6之前,synchroized是一个重量锁,因为他需要调用c语言库,所以产生用户态向内核态的切换,导致效率低下,jdk1.6之后引入了偏向锁和轻量级锁,所以在并发较高的情况下效率比lock高,但是lock提供的方法比较丰富

2.volatile关键字总结

  • volatile是jvm提供的轻量级同步机制,具有三个特性

  • 1.保证可见性:可见性就是当一个线程内的数据被更改,在数据刷到主存之前,其他数据可以知道

  • 2.不保证原子性:比如i++等操作不是原子操作,在++之前,值可能被更改

  • 3.禁止指令重排:就是保证特定操作顺序,保证某些变量的内存可见性,它会在写操作之前加入一道store屏障,将工作内存的共享变量刷新回主存,会在读之前加入一条load屏障指令,从主内存中读取共享变量。
    3.jmm内存模型

  • 首先并不是真实存在,而是一组规范,硬盘<内存<cpu

  • 线程解锁前,所有变量拷贝进各自线程工作内存

  • 线程加锁前必须读取主内存的最新值到各自工作内存

  • 加锁和解锁必须是同一把锁
    4.如何解决不保证原子性

  • 加sync

  • 用juc的原子类atomicInteger

java学习交流github地址:https://github.com/lx-IT-P/

猜你喜欢

转载自blog.csdn.net/weixin_44302240/article/details/103967373