多线程--安全

#### 1.线程安全问题安全


什么是线程安全问题:当多个线程同时访问一个全局变量,注意(作写的操做的时候可能会受到别的线程的干扰),作读的操做的时候不会发生线程安全问题多线程


如  ++  ,  --  修改等操做  抢火车票的操做,就会引起线程安全问题并发

图片




模拟场景:ide


```this

package com.yxl.demo.ThreadTest;spa


public class test5 {线程


   public static void main(String[] args) {3d


       TestDemo thread = new TestDemo();blog

       Thread t1 = new Thread(thread,"窗口一");图片

       Thread t2 = new Thread(thread,"窗口二");

       t1.start();

       t2.start();

   }

}


class TestDemo implements Runnable{

   //共享的火车票变量

   private  int count = 100;


   //重寫run方法

   @Override

   public void run() {

       while (count > 0){

           try {

            //休眠一下 方便出现并发问题

               Thread.sleep(50);

           }catch (Exception e){

               e.getMessage();

           }

           sale();

       }

   }

   //卖票

   public void sale(){

       if(count > 0){

           System.out.println(Thread.currentThread().getName() +"出售 :" +(100 -  count + 1));

           count--;

       }

   }

}


```


运行结果以下:会发现出现卖重复票的问题



图片



##### 解决这个线程安全问题


##### 内置锁(Synchronized)保证线程原子性,当先车管进入方法自动的获取锁,当某一个线程获取到锁后,其余线程就会等待,


锁的特性:只有一个线程进行使用。


放程序执行完毕之久,就会把锁释放,可是锁会下降程序的运行效率,


##### Synchronized 也是 重入锁,内置锁也是互斥锁


使用 Synchronized 有两种方式,  同步方法(使用的是this锁),同步代码块


synchronized 修饰方法使用锁是当前this锁。


synchronized 修饰静态方法使用锁是当前类的字节码文件


##### 显示锁 (lock锁)



解决方案 :


##### 1.同步方法



图片



2. ##### 同步代码块



图片



使用同步代码块的时候 注意(锁必定要使用同一个锁 )




问:如何解决多线程之间线程安全问题


***\*答:使用多线程之间同步synchronized或使用锁(lock)。\****


问:为何使用线程同步或使用锁能解决线程安全问题呢?


***\*答:将可能会发生数据冲突问题(线程不安全问题),只能让当前一个线程进行执行。代码执行完成后释放锁,让后才能让其余线程进行执行。这样的话就能够解决线程不安全问题。\****


问:什么是多线程之间同步


***\*答:当多个线程共享同一个资源,不会受到其余线程的干扰。\****

相关文章
相关标签/搜索