Post Jobs

等待唤醒机制,万能弹出层

伟德体育 4

function ShowMsg(str) {//要提示的文字
$(“.payment_time_mask”).remove();
$(“body”).append(“<div class=\”payment_time_mask\” style=\”
background-color:#ccc; display:none; text-align: center;z-index:
999;width: 50%;position: absolute;left: 25%;top: 20%;border-radius:
10px;overflow: hidden;\”><span style=’font-size:
18px;font-weight:bold;padding: 0.5em;display: block;’>” + str +
“</span></div>”);
$(“.payment_time_mask”).fadeToggle(1500);//持续时间
伟德体育,$(“.payment_time_mask”).fadeToggle(1500);
}

一、系统环境 

操作系统:Windows10专业版 64位
Redis版本:redis-64.3.0.503

今日内容介绍
1、多线程安全问题
2、等待唤醒机制

二、问题描述

01线程操作共享数据的安全问题

  *A:线程操作共享数据的安全问题
    如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。
    程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

1.命令行启动:

redis-server redis.windows.conf

可以启动成功;

02售票的案例

*A:售票的案例

 /*
  * 多线程并发访问同一个数据资源
  * 3个线程,对一个票资源,出售
  */
 public class ThreadDemo {
  public static void main(String[] args) {
    //创建Runnable接口实现类对象
    Tickets t = new Tickets();
    //创建3个Thread类对象,传递Runnable接口实现类
    Thread t0 = new Thread(t);
    Thread t1 = new Thread(t);
    Thread t2 = new Thread(t);

    t0.start();
    t1.start();
    t2.start();

  }
 }

 public class Tickets implements Runnable{

  //定义出售的票源
  private int ticket = 100;
  private Object obj = new Object();

  public void run(){
    while(true){

        if( ticket > 0){

          System.out.println(Thread.currentThread().getName()+" 出售第 "+ticket--);
        }

    }
  }
 }

2.将Redis安装为Windows系统服务:

redis-server --service-install redis.windows-service.conf --loglevel verbose

03线程安全问题引发

*A:线程安全问题引发

/*
 * 多线程并发访问同一个数据资源
 * 3个线程,对一个票资源,出售
 */
public class ThreadDemo {
 public static void main(String[] args) {
   //创建Runnable接口实现类对象
   Tickets t = new Tickets();
   //创建3个Thread类对象,传递Runnable接口实现类
   Thread t0 = new Thread(t);
   Thread t1 = new Thread(t);
   Thread t2 = new Thread(t);

   t0.start();
   t1.start();
   t2.start();

 }
}
/*
 *  通过线程休眠,出现安全问题
 */
public class Tickets implements Runnable{

 //定义出售的票源
 private int ticket = 100;
 private Object obj = new Object();

 public void run(){
   while(true){

     //对票数判断,大于0,可以出售,变量--操作
       if( ticket > 0){
         try{
            Thread.sleep(10); //加了休眠让其他线程有执行机会
         }catch(Exception ex){}
         System.out.println(Thread.currentThread().getName()+" 出售第 "+ticket--);
       }
   }
 }
}

3.进入系统服务页面:

Win + r打开运行命令框,services.msc打开系统服务页面

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

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

  *A:售票的案例
      /*
       * 多线程并发访问同一个数据资源
       * 3个线程,对一个票资源,出售
       */
      public class ThreadDemo {
       public static void main(String[] args) {
         //创建Runnable接口实现类对象
         Tickets t = new Tickets();
         //创建3个Thread类对象,传递Runnable接口实现类
         Thread t0 = new Thread(t);
         Thread t1 = new Thread(t);
         Thread t2 = new Thread(t);

         t0.start();
         t1.start();
         t2.start();

       }
      }
      /*
       *  通过线程休眠,出现安全问题
       *  解决安全问题,Java程序,提供技术,同步技术
       *  公式:
       *    synchronized(任意对象){
       *      线程要操作的共享数据
       *    }
       *    同步代码块
       */
      public class Tickets implements Runnable{

       //定义出售的票源
       private int ticket = 100;
       private Object obj = new Object();

       public void run(){
         while(true){
           //线程共享数据,保证安全,加入同步代码块
           synchronized(obj){
           //对票数判断,大于0,可以出售,变量--操作
             if( ticket > 0){
               try{
                  Thread.sleep(10);
               }catch(Exception ex){}
               System.out.println(Thread.currentThread().getName()+" 出售第 "+ticket--);
             }
           }
         }
       }
      }

4.启动redis服务

伟德体育 1

 

启动报错,错误信息如下:

伟德体育 2 

05同步代码块的执行原理

   A:同步代码块的执行原理
     同步代码块: 在代码块声明上 加上synchronized
     synchronized (锁对象) {
       可能会产生线程安全问题的代码
     }
     同步代码块中的锁对象可以是任意的对象;但多个线程时,要使用同一个锁对象才能够保证线程安全。

三、解决方案

在redis-64.3.0.503文件夹下新建一个空文件夹,命名为logs,如下图所示:

伟德体育 3

重新启动redis服务,可以启动成功,如下图:

伟德体育 4

 至此,问题已解决。

06同步的上厕所原理

  *A:同步的上厕所原理
    a:不使用同步:线程在执行的过程中会被打扰
       线程比喻成人
       线程执行代码就是上一个厕所
      第一个人正在上厕所,上到一半,被另外一个人拉出来
    b:使用同步:
       线程比喻成人
       线程执行代码就是上一个厕所
       锁比喻成厕所门
      第一个人上厕所,会锁门
      第二个人上厕所,看到门锁上了,等待第一个人上完再去上厕所

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图