鱼C论坛

 找回密码
 立即注册
查看: 2801|回复: 0

[学习笔记] java笔记 线程4 --安全性

[复制链接]
发表于 2017-8-20 03:20:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 可爱的静静 于 2017-8-22 14:50 编辑

多线程安全问题
线程运行状态

看图一啊啊啊 啊啊啊啊 啊 啊 在最后面
哈哈哈哈哈   打错字了我  是清亡
1.      Sleep(time) 也就是休眠的状态 本来有执行去哪执行资格了,但是休眠一段时间后,时间到了 就再有执行资格执行权就是运行的状态,但是如果在它休眠的时候,执行权被其他线程抢了,就变成是临时状态了,有执行走个没有执行权
2 就是你有执行资格,但是抢不到cpu执行权  其他线程在执行的话就是临时状态了
3 就是线程结束了 run方法执行完就结束啦 或者是stop()方法
例子:
  1. package UI;

  2. import java.lang.Thread;

  3. public class sport {
  4.    public static void main(String[] args) {
  5.       
  6.           Ticket  a=new Ticket();
  7.           Ticket  b=new Ticket();
  8.          Thread b1 =new Thread(a);
  9.          Thread b2 =new Thread(a);
  10.          b1.start();
  11.          try {   Thread.sleep(10);} catch (Exception e){};
  12.          a.flag=false;
  13.          b2.start();
  14.          }

  15.    }
  16. class Ticket implements Runnable
  17. {
  18.    private int ticket=100;
  19.    boolean flag =true;
  20.    Object obj =new Object();
  21.    public void run(){
  22.       if(flag){
  23.       while(true){
  24.            synchronized(this){//代码块
  25.               if(ticket>0){
  26.                try {   Thread.sleep(10);} catch (Exception e){};
  27.          System.out.println(Thread.currentThread().getName()+"Ticket---:"+ticket--);
  28.          }
  29.       }
  30.       }
  31.       }
  32.       else
  33.          while(true)
  34.             show();
  35.    }
  36.    public synchronized void show(){//同步函数
  37.       if(ticket>0)
  38.            if(ticket>0){
  39.               try {   Thread.sleep(10);} catch (Exception e){};
  40.             System.out.println(Thread.currentThread().getName()+"…sale:"+ticket--);
  41.     }
  42.    }
  43. }
复制代码

假设:

看图二啊啊啊 啊  在最后面   
所以当线程2执行完if语句判断后,线程1就参与进来,执行,当线程重新执行就不再做判断直接输出  无论是不是大于 0 然后共享数据 a-1 所以程序执行完后 输出结果有可能有-1 0等错误数据
举个例子:(让执行判断if()判断之后睡眠 被其他线程参与 看看有什么后果
结果问题:明明是只卖100张票可是结果是有0 1 -1  这些就是错误信息
问题原因:  当多条语句在操作一个线程共有数据时,一个线程对多条语句值执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享线程数据错误
解决办法:
  对多条操作共享数据的语句,只能让一个线程执行完,在执行过程中,其他线程不能参与
用代码同步就可以解决这个问题了
         synchronired(对象)
同步数据后的代码块:
  1. package UI;

  2. import java.lang.Thread;

  3. public class sport {
  4.    public static void main(String[] args) {
  5.       
  6.           Ticket  a=new Ticket();
  7.          Thread b1 =new Thread(a);
  8.          Thread b2 =new Thread(a);
  9.          b1.start();
  10.          try {Thread.sleep(2);} catch (Exception e){};
  11. /*睡眠一下
  12. 睡眠时间是不是被其他线程参与进来就不再判断if 对if()里面的代码是不是有影响*/
  13.          b2.start();
  14.          
  15.          
  16.          }

  17.    }
  18. class Ticket implements Runnable
  19. {
  20.   private int ticket=100;
  21.    public void run(){
  22.    while(true){
  23.       if(ticket>0){
  24.       synchronized(this){
  25.          try {Thread.sleep(2);} catch (Exception e){};//睡眠时间 这时候线程被其他线程参与进来了
  26.          System.out.println(Thread.currentThread().getName()+"啦啦啦:"+ticket--);
  27.          }
  28.       }
  29.       }
  30.    }
  31. }
复制代码



同步函数:也是用synchronired(对象)
同步函数放的代码:
  1. package UI;

  2. import java.lang.Thread;

  3. public class sport {
  4.    public static void main(String[] args) {
  5.       
  6.           Ticket  a=new Ticket();
  7.           Ticket  b=new Ticket();
  8.          Thread b1 =new Thread(a);
  9.          Thread b2 =new Thread(a);
  10.          b1.start();
  11.          try {   Thread.sleep(10);} catch (Exception e){};
  12.          a.flag=false;
  13.          b2.start();
  14.          }

  15.    }
  16. class Ticket implements Runnable
  17. {
  18.    private int ticket=100;
  19.    boolean flag =true;
  20.    Object obj =new Object();
  21.    public void run(){
  22.       if(flag){
  23.       while(true){
  24.            synchronized(this){//代码块
  25.               if(ticket>0){
  26.                try {   Thread.sleep(10);} catch (Exception e){};
  27.          System.out.println(Thread.currentThread().getName()+"Ticket---:"+ticket--);
  28.          }
  29.       }
  30.       }
  31.       }
  32.       else
  33.          while(true)
  34.             show();
  35.    }
  36.    public synchronized void show(){//同步函数
  37.       if(ticket>0)
  38.            if(ticket>0){
  39.               try {   Thread.sleep(10);} catch (Exception e){};
  40.             System.out.println(Thread.currentThread().getName()+"…sale:"+ticket--);
  41.     }
  42.    }
  43. }
复制代码




2.png
1.png

评分

参与人数 2荣誉 +5 鱼币 +9 收起 理由
小甲鱼 + 4
不二如是 + 5 + 5 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 12:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表