并发编程-同步锁
如果多线程在做同一件事
- 原子性 Synchronized,Atomicxxx、lock、
- 可见性 Synchronized,volatile
- 有序性 Synchronized,volatile
关于线程安全问题的简述
public class AtomicDemo {
int i = 0;
public synchronized void incr(){
i++;
}
public static void main(String[] args) throws InterruptedException {
AtomicDemo ad = new AtomicDemo();
Thread[] threads = new Thread[2];
for (int i = 0; i < 2; i++) {
threads[i] = new Thread(() ->{
for (int j = 0; j < 10000; j++) {
ad.incr();
}
});
threads[i].start();
}
threads[0].join();
threads[1].join();
System.out.println("Result:"+ ad.i);
}
}
java中同步锁-Synchronized
Synchronized作用范围
// 修饰实例方法
public synchronized void m1(){
}
//放入Synchronized中范围
static Object lock = new Object();//全局锁
Object o1 = new Object();//当前实例锁。//在内存中会分配一个地址来存储
public void m2(){
//代码块1、this表示当前实例对象2、SyncHronizedDemo.Class表示当前对象
synchronized (lock){//当前对象
}
}
public synchronized static void m3(){
}
- 修饰实例方法
- 静态方法
- 修饰代码块
//括号中可以存储任何一个对象
```java
synchronized (SyncHronizedDemo.class)
影响锁的作用范围,其实本质就是对象的生命周期
抢占锁的本质:
实现互斥:
- 共享资源
- 可以是一个标记,0:无锁,1:有锁
对齐填充
64位虚拟机
8个字节
Synchronized锁升级
-
无锁
-
偏向锁
-
轻量级锁
避免线程阻塞
自旋锁
-
重量级锁
- 用户态到内核态的交换
- 没有获得锁的线程会阻塞,再被唤醒
CAS机制
以下操作必须是原子性的:
修改锁的标记;
修改线程指针的指向;
CompareAndSwap(old,expect,update)
old:ThreadA
expect:ThreadB
update:ThreadC
乐观锁