SE8-卖票-Sychronized和CAS区别-以及用继承extends卖票 需要注意的点

Sychronized和CAS区别

CASSychronized
乐观锁悲观锁
使用者:原子类,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张

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值