Sychronized和CAS区别
CAS Sychronized 乐观锁 悲观锁 使用者:原子类,ConcurrentHashMap 使用者:同步方法,同步代码块,ReentrantLock,HashTable 只对修改时加锁,不会阻塞 对其他线程阻塞 效率较高,相比悲观锁不是特别保险 绝对安全,效率低 CAS:旧值和主内存的值相同,不代表没动过。
AtomicInteger:只能解决一个变量的原子性
synchronized:可以解决一段代码的原子性
CAS和Synchronized都可以保证多线程环境下共享数据的安全性。那么他们两者有什么区别?
Synchronized是从悲观的角度出发:
总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁
(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。因此Synchronized我们也将其称之为悲观锁。jdk中的ReentrantLock也是一种悲观锁。
CAS是从乐观的角度出发:
总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。
CAS这种机制我们也可以将其称之为乐观锁。
实现类
package com.itheima._6卖票.继承_卖票; public class MyThread extends Thread { private static int ticket = 100;//加static等于 3个对象new MyThread() 可以共享这100张 private static Object obj = new Object();//用静态static修饰,锁对象obj才是唯一且共享的 @Override public void run() { while (true) { //synchronized (MyThread.class) {//因为class类是唯一的 synchronized (obj) {//锁对象obj必须唯一 if (ticket <= 0) { break; } else { //休眠10毫秒 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } ticket--;//每卖出去 减一张 System.out.println(Thread.currentThread().getName() + "在卖票,还剩下" + ticket + "张"); } } } } }
测试类
package com.itheima._6卖票.继承_卖票;
public class Test {
public static void main(String[] args) {
MyThread t1 = new MyThread();//ticket票跟着成员变量走的,若不加static,new MyThread();就是卖各自的100张
MyThread t2 = new MyThread();
MyThread t3 = new MyThread();
t1.start();
t2.start();
t3.start();
}
}
结果
Thread-0在卖票,还剩下99张
Thread-0在卖票,还剩下98张
Thread-0在卖票,还剩下97张
Thread-0在卖票,还剩下96张
Thread-0在卖票,还剩下95张
Thread-0在卖票,还剩下94张
Thread-0在卖票,还剩下93张
Thread-0在卖票,还剩下92张
Thread-0在卖票,还剩下91张
Thread-0在卖票,还剩下90张
Thread-0在卖票,还剩下89张
Thread-0在卖票,还剩下88张
Thread-0在卖票,还剩下87张
Thread-0在卖票,还剩下86张
Thread-0在卖票,还剩下85张
Thread-0在卖票,还剩下84张
Thread-0在卖票,还剩下83张
Thread-0在卖票,还剩下82张
Thread-0在卖票,还剩下81张
Thread-0在卖票,还剩下80张
Thread-0在卖票,还剩下79张
Thread-0在卖票,还剩下78张
Thread-0在卖票,还剩下77张
Thread-0在卖票,还剩下76张
Thread-0在卖票,还剩下75张
Thread-0在卖票,还剩下74张
Thread-0在卖票,还剩下73张
Thread-0在卖票,还剩下72张
Thread-0在卖票,还剩下71张
Thread-0在卖票,还剩下70张
Thread-0在卖票,还剩下69张
Thread-0在卖票,还剩下68张
Thread-0在卖票,还剩下67张
Thread-0在卖票,还剩下66张
Thread-0在卖票,还剩下65张
Thread-0在卖票,还剩下64张
Thread-0在卖票,还剩下63张
Thread-0在卖票,还剩下62张
Thread-0在卖票,还剩下61张
Thread-0在卖票,还剩下60张
Thread-0在卖票,还剩下59张
Thread-0在卖票,还剩下58张
Thread-0在卖票,还剩下57张
Thread-0在卖票,还剩下56张
Thread-0在卖票,还剩下55张
Thread-0在卖票,还剩下54张
Thread-0在卖票,还剩下53张
Thread-0在卖票,还剩下52张
Thread-0在卖票,还剩下51张
Thread-0在卖票,还剩下50张
Thread-0在卖票,还剩下49张
Thread-0在卖票,还剩下48张
Thread-0在卖票,还剩下47张
Thread-0在卖票,还剩下46张
Thread-0在卖票,还剩下45张
Thread-0在卖票,还剩下44张
Thread-0在卖票,还剩下43张
Thread-0在卖票,还剩下42张
Thread-0在卖票,还剩下41张
Thread-0在卖票,还剩下40张
Thread-0在卖票,还剩下39张
Thread-0在卖票,还剩下38张
Thread-0在卖票,还剩下37张
Thread-0在卖票,还剩下36张
Thread-0在卖票,还剩下35张
Thread-0在卖票,还剩下34张
Thread-0在卖票,还剩下33张
Thread-0在卖票,还剩下32张
Thread-0在卖票,还剩下31张
Thread-0在卖票,还剩下30张
Thread-0在卖票,还剩下29张
Thread-0在卖票,还剩下28张
Thread-0在卖票,还剩下27张
Thread-0在卖票,还剩下26张
Thread-0在卖票,还剩下25张
Thread-0在卖票,还剩下24张
Thread-0在卖票,还剩下23张
Thread-0在卖票,还剩下22张
Thread-0在卖票,还剩下21张
Thread-0在卖票,还剩下20张
Thread-0在卖票,还剩下19张
Thread-0在卖票,还剩下18张
Thread-0在卖票,还剩下17张
Thread-0在卖票,还剩下16张
Thread-0在卖票,还剩下15张
Thread-0在卖票,还剩下14张
Thread-0在卖票,还剩下13张
Thread-0在卖票,还剩下12张
Thread-0在卖票,还剩下11张
Thread-0在卖票,还剩下10张
Thread-0在卖票,还剩下9张
Thread-0在卖票,还剩下8张
Thread-0在卖票,还剩下7张
Thread-0在卖票,还剩下6张
Thread-0在卖票,还剩下5张
Thread-0在卖票,还剩下4张
Thread-0在卖票,还剩下3张
Thread-0在卖票,还剩下2张
Thread-0在卖票,还剩下1张
Thread-0在卖票,还剩下0张