1.为什么需要synchronize
我自己的理解(问题):当多个线程对同一个对象M进行操作的时候,如果是非原子性对象(比如a++这样的,要分好几个指令来走),A线程处理该对象M的时候,很可能会出现在执行完某个指令之后,因为被分配到cpu时间片段用完了,只能等待再次被分配时间片段,而这时,其他线程(线程B)对该对象进行了操作,导致对象M的值不一样了,之后由于A线程被分配到了时间片段,所以可以继续执行未处理完的指令,但是它很傻,不会在处理前看看对象M是否已经变了,而是继续按照之前拿到值进行操作。
我自己的理解(处理):两种方式 ①在对象M上加一个判断,使得线程A在处理该数据的时候,会去拿最新的值与原值进行比较,如果没有人动过,那就继续完成其它指令。
②加上一个保护,我没有完成一系列的指令前,谁都不能动,直到我完成了相关指令,其它线程才能对其进行处理。这样可以保证其原子性。
我自己的理解(具体实现):①咱们可以用CAS(compare and swap)来进行
//声明
private static AtomicInteger count=new AtomicInteger(0);
//使用 自增
cout.incrementAndGet();
//使用 自减
cout.decrementAndGet();
②可以用synchronize来实现原子性
//想要哪一快保持原子性,就把那一块用中括号括起来
synchronized(this){
a++
}
//静态方法需要的是类锁,所以需要.class对象的锁
synchronized(b.class){
a++
}
当然也可以用lock来锁,这个是程序员自己整的,也能保持原子性,但是呢,要注意不能加上try语块,免得出现异常,出现了死锁
//声明一把可重入锁
private ReentrantLock lock=new ReentrantLock();
//上锁
lock.lock();
try{
a++
}finally{
//释放锁
lock.unlock;
}