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