这个案例每一次都进行锁得判断,获取锁,最后释放锁,效率非常慢
代码改写:
public class Runnable implements java.lang.Runnable {
// private static Object lock=new Object();
// private int count =0;//表白得次数
AtomicInteger ac=new AtomicInteger(0);
@Override
public void run() {
for (int i = 0; i < 100; i++) {
//从共享数据中读取数据到本地栈
//修改本线程中变量副本得值
//会把本线程栈中变量的值赋给共享数据
// synchronized (lock) {
//count++;
//ac++是一个错误得值 ac是一个对象 对象不能++ 得调用里边得方法
int count = ac.incrementAndGet();
System.out.println("我要向你表白"+count+"次");
// }
}
}
}
public class Demo {
public static void main(String[] args) {
Runnable r=new Runnable();
for (int i = 0; i < 100; i++) {
new Thread(r).start();
}
}
}
count++ 可能会被其他 线程抢走 但是刚刚得原子类 就可以保证自增得这几步要么都成功要么都失败AtomicInteger原理
自旋锁+CAS算法
CAS算法:当有三个操作数(内存之V,旧的预期值A,要修改得值B)
旧的预期值A==内存值 此时修改成功 将V修改为B
旧的预期值A!=内存之 此时修改失败 不做任何操作
重新获取现在得最新值,这个重新获取得动作就称之为自旋