#### 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)。\****
问:为何使用线程同步或使用锁能解决线程安全问题呢?
***\*答:将可能会发生数据冲突问题(线程不安全问题),只能让当前一个线程进行执行。代码执行完成后释放锁,让后才能让其余线程进行执行。这样的话就能够解决线程不安全问题。\****
问:什么是多线程之间同步
***\*答:当多个线程共享同一个资源,不会受到其余线程的干扰。\****