解决线程安全问题_同步代码块,同步技术的原理

解决线程安全问题_同步代码块:

同步代码块:synchronized关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。

格式:

synchronized(同步锁){
    需要同步操作的代码
}
package Demo01.Sychronized;

public class RunnableImpl implements  Runnable{
    //定义一个多线程共享的票源
    private  int ticket =100;

    //创建一个锁对象
    Object object=new Object();
    //设置线程任务:卖票
    @Override
    public void run() {
        //使用死循环,让卖票操作重复执行
        while(true){
           synchronized (object){
               //先判断票是否存在
               if (ticket>0){
                   //提高安全问题出现的概率,让程序睡眠
                   try {
                       Thread.sleep(10);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   //票存在,卖票 ticket--
                   System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket+"张票");
                   ticket--;
               }

           }
        }
    }
    //定义一个多线程共享的票源
}

 

 

 

同步技术的原理:

使用了一个锁对象,这个锁对象叫同步锁,也叫对象锁,也叫对象监视器

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

to抢到了cpu的执行权,执行run方法,遇到synchronized代码块

这时t0会检查synchronization代码块是否有锁对象

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

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

发现没有,t1救护进入到阻塞状态,会一直等待t0线程归坏锁对象

一直到t0线程执行完同步中的代码块,会把锁对象归还给同步代码块

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

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

/提高安全问题出现的概率,让程序睡眠
try{
    Thread.sleep(millis: 10);
}catch (InterruptedException e){
    e.printStackTrace();
}

 

 

 

posted @ 2022-07-07 21:56  冰灵IT  阅读(30)  评论(0)    收藏  举报