首页 > 其他分享 >多线程同步与安全

多线程同步与安全

时间:2023-04-03 21:22:21浏览次数:33  
标签:同步 name Thread money 安全 zhangHu new 多线程 public

三大不安全线程

//模拟不安全的买票
public class TestBuyTicket {
   public static void main(String[] args) {
       maiPiao maiPiao=new maiPiao();

       new Thread(maiPiao,"小明").start();
       new Thread(maiPiao,"小红").start();
       new Thread(maiPiao,"小兰").start();
  }
}

class maiPiao implements Runnable{

   private int piao=10;
  boolean flag=true;
   @Override
   public void run() {

       while (flag) {
           try {
               buy();
          } catch (InterruptedException e) {
               throw new RuntimeException(e);
          }
      }
  }
   private void buy() throws InterruptedException {
        if (piao<=0){
            flag=false;
            return;
        }
        Thread.sleep(100);
       System.out.println(Thread.currentThread().getName()+"拿到了"+piao--);
  }
}
//模拟不安全取钱
public class TestBank {
   public static void main(String[] args) {
       ZhangHu zhangHu=new ZhangHu("结婚基金",100);

       YingHang yingHang=new YingHang(zhangHu,"我",50);
       YingHang yingHang2=new YingHang(zhangHu,"你",100);
       yingHang.start();
       yingHang2.start();
  }
}
class ZhangHu{
   public String name;
   public int money;

   public ZhangHu(String name, int money) {
       this.name = name;
       this.money = money;
  }
}

class YingHang extends Thread{


   private ZhangHu zhangHu;
   private int money;

   public YingHang(ZhangHu zhangHu, String name, int money) {
       super(name);
       this.zhangHu = zhangHu;
       this.money = money;
  }

   @Override
   public void run() {
       if (zhangHu.money-money<0){
           System.out.println("对不起,您的钱不够");
           return;
      }
       try {
           Thread.sleep(3000);
      } catch (InterruptedException e) {
           throw new RuntimeException(e);
      }
       System.out.println(zhangHu.name+"余额为"+zhangHu.money);
       zhangHu.money=zhangHu.money-money;
       System.out.println(zhangHu.name+"还剩"+zhangHu.money);
  }

}
//模拟不安全集合
public class TestFeList {
   public static void main(String[] args) {
       List<String> list=new ArrayList<>();
       for (int i = 0; i < 1000; i++) {
           new Thread(()->list.add(Thread.currentThread().getName())).start();
      }
       System.out.println(list.size());
  }

}

synchronized

synchronized 默认锁的是this

锁的对象就是变化的量,监视 的对象需要增删改的对象

用synchroized优化完的代码:

//在需要修改量的方法里加入synchroized
private synchronized void buy() throws InterruptedException {
        if (piao<=0){
            flag=false;
            return;
        }
        Thread.sleep(100);
       System.out.println(Thread.currentThread().getName()+"拿到了"+piao--);
  }

public void run() {
   //在需要修改变化的量加入synchronized的代码块
       synchronized (zhangHu){
           if (zhangHu.money-money<0){
               System.out.println("对不起,您的钱不够");
               return;
          }
           try {
               Thread.sleep(3000);
          } catch (InterruptedException e) {
               throw new RuntimeException(e);
          }
           System.out.println(zhangHu.name+"余额为"+zhangHu.money);
           zhangHu.money=zhangHu.money-money;
           System.out.println(zhangHu.name+"还剩"+zhangHu.money);
      }

  }
public class TestFeList {
   public static void main(String[] args) {
       List<String> list=new ArrayList<>();
       for (int i = 0; i < 1000; i++) {
           synchronized (list){
               new Thread(()->list.add(Thread.currentThread().getName())).start();
          }

      }
       try {
           Thread.sleep(3000);
      } catch (InterruptedException e) {
           throw new RuntimeException(e);
      }
       System.out.println(list.size());
  }

}
 

标签:同步,name,Thread,money,安全,zhangHu,new,多线程,public
From: https://www.cnblogs.com/wukangxiang/p/17284508.html

相关文章

  • Java多线程
    1.可见性、原子性和有序性问题多线程有三大特性,分别是可见性、原子性和有序性。1.1可见性  在单核时代,所有的线程都是在一颗CPU上执行,CPU缓存与内存的数据一致性容易解决。因为所有线程都是操作同一个CPU的缓存,一个线程对缓存的写,对另外一个线程来说一定是可见的。一个线程......
  • HCIP-ICT实战进阶12-接入安全技术介绍
    HCIP-ICT实战进阶12-接入安全技术介绍HCIP最后一篇理论博客了,这个搞完我再考虑要不要把系统集成也整一份博客,还是把HCIP实验的博客整理整理,这学期争取去国科那边接接项目吧.0前言在这篇博客中,我将介绍常见的以太网交换安全技术,包括端口隔离、端口安全、MAC地址表安......
  • 日常生活小技巧 -- 惠普 Windows10 进入安全模式
    今天手贱,是真的很贱。将用户模式从管理员组改为标准用户方法是:WIN+R打开controluserpasswords2然后出现了用户账户控制,你要允许此应用对你的设备进行更改吗?最关键的是没有“是”选项。试了各种方法都不成功。比如网上说的进入命令提示符(管理员)或者更改用户账户控制设置,都会弹出......
  • 智安网络|2023年网络安全未来的发展趋势
    随着“云大物移智”技术的不断成熟,互联网与物联网技术的不断融合,未来将有越来越多的物联网设备接入互联网,物联网产业将在中国蓬勃发展。目前,我国已出台了大量政策法规,引导和规范我国物联网产业的发展,并鼓励企业加大研发力度,努力将我国物联网产业发展成为全球领先的高科技产业。为了......
  • 原点安全出席CIFS 中国数智金融年会,分享数据安全新理念
    数据安全平台是把数据安全治理工作化繁为简的必由之路!2023年3月30日-31日,由金融信息化研究所指导,上海金融信息行业协会、北京互联网金融行业协会指导的CIFS中国数智金融年会在北京顺利召开。大会以“新金融•新技术•新链接”为主题,汇集350+来自国内外头部银行、保险、证券等金融......
  • 阿里云RDS与ECS自建mysql数据库主从同步(GTID方式)
      1、GTID的概念全局事务标识:globaltransactionidentifiers;GTID是一个事务一一对应,并且全局唯一ID;一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致;GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUT......
  • 06-网络安全-kail linux渗透测试(基础篇)
    渗透测试是一个非常广的课程,我们首先要做的是在某个方向精通,再在其他方面也要有涉猎。大部分的漏洞是国外挖掘的。一、推荐研究书籍:Metasploit浚透测试指南》肯尼(行业经典)  诸葛建伟翻译《Metasloit渗透测试魔鬼训练营》诸葛建伟(国内经典)《网络攻击技术与实践》诸葛建伟......
  • git远程分支与本地分支同步
    1.先执行gitfetch2.再执行gitcheckout分支名查看所有本地分支gitbranch查看所有远程分支gitbranch-r查看远程分支和本地分支的关联关系的命令gitremoteshoworigin命令解析gitremoteshoworigin命令会显示与名为origin的远程代码库相关的信息,包括远......
  • 智能且集成的端到端移动应用程序安全解决方案——Quixxi简介
    移动应用程序安全变得简单快捷Quixxi是一种智能且集成的端到端移动应用程序安全解决方案。这个强大的工具可供开发人员在几分钟内保护和监控任何移动应用程序。 QuixxiSecurity评估应用程序,以便您了解它们有哪些漏洞。它允许您对应用程序进行渗透测试,并在应用程序周围放置......
  • rsync远程同步实验
     配置源服务器   systemctlstopfirewalld setenforce0rpm-qrsync#一般系统已默认安装rsync#建立/etc/rsyncd.conf配置文件vim/etc/rsyncd.conf#添加以下配置项uid=root......