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

同步技术的原理

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

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 @ 2022-07-08 16:43  xjw12345  阅读(426)  评论(0)    收藏  举报