同步技术的原理以及同步方法

同步技术的原理

同步技术的原理:
使用了一个锁对象,这个锁对象叫同步锁,也叫对象监视器

3个线程—起抢夺cpu的执行权谁抢到了谁执行run方法进行卖票

  t0抢到了cpu的执行权执行run方法,遇到synchronized代码块这时t0会检查synchronized代码块是否有锁对象

  发现有,就会获取到锁对象,进入到同步中执行

  t1抢到了cpu的执行权执行run方法遇到synchronized代码块这时t1会检查synchronized代码块是否有锁对象

  发现没有,t1就会进入到阻塞状态会一直等待t0线程归还锁对象一直到t0线程执行完同步中的代码会把锁对象归还给同步代码块,

  t1才能获取到锁对象进入到同步中执行


总结:同步中的线程,没有执行完毕不会释放锁,同步外的线程没有锁进不去同步

 

 

 

 

 

 

 

 

解决线程安全问题——同步方法

同步方法:使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外等着。

格式:

public synchronized void method(){
        可能会产生线程安全问题的代码块
}

使用步骤:
  1.把访问了共享数据的代码抽取出来,放到一个方法中

  2.在方法上添加synchronized修饰符

复制代码
class RunnaleImpl implements Runnable{
    //定义一个多个线程共享的票源
    private int ticket = 100;
    //设置线程任务:卖票
    @Override
    public void run() {
        //使用死循环让卖票操作重复执行
        while (true){
            payTicket();
        }
    }
    //定义一个同步方法
    public synchronized void payTicket(){
        //判断票是否存在
        if (ticket>0){
            //提高安全问题出现的概率,让程序睡眠
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //票存在,卖票,ticket--
            System.out.println(Thread.currentThread().getName()+"-->正在卖第"+ticket+"张票");
            ticket--;
        }
    }
}
复制代码
复制代码
public class Demo01Ticket {
    /**
     * 模拟卖票案例
     * 创建3个线程,同时开启,对共享的票进行出售
     */
    public static void main(String[] args) {
        RunnaleImpl ru = new RunnaleImpl();
        Thread t0 = new Thread(ru);
        Thread t1 = new Thread(ru);
        Thread t2 = new Thread(ru);
        t0.start();
        t1.start();
        t2.start();
    }
}
复制代码

同步方法也会把方法内部的代码锁住

只让一个线程执行

同步方法的锁对象是谁?

就是实现类对象new RunnabbeImpl()也是就是this

 

posted @   xjw12345  阅读(404)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示