java 线程六-解决线程安全隐患问题-加锁

2024-06-12 08:08

本文主要是介绍java 线程六-解决线程安全隐患问题-加锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求:
银行有一个金库
有两个储户分别存300元,每次存100,共存三次。

目的:判断该程序是否有安全问题,如果有该怎么解决?

如何找出安全隐患?
1,明确哪些代码是多线程运行代码。
2,明确共享数据。
3,明确多线程运行代码中哪些是操作共享数据的。
*/

/*
解决线程安全隐患问题,有两种方法:
1,使用synchronized(对象){同步代码块}
2,使用同步函数,即用synchronized来修饰函数,达到同步的目的。
class Bank
{private int sum;//Object obj=new Object();public synchronized void add(int x){//synchronized(obj)//{try{Thread.sleep(10);}catch (InterruptedException e){}sum=sum+x;System.out.println("sum"+sum);//}}
}class Cus implements Runnable
{private Bank b=new Bank();public void run(){for(int i=0;i<3;i++){b.add(100);}}}class BankDemo 
{public static void main(String[] args) {Cus c=new Cus();Thread t1=new Thread(c);Thread t2=new Thread(c);t1.start();t2.start();//System.out.println("Hello World!");}
}

/*
当有多个生产者和消费者时:
1,需要使用while循环判断资源生产标识,是可生产的状态还是可取的状态。
2,需要使用notifyAll来唤醒所有线程,否则如果使用notify的话,会出现所有线程都等待(wait())的情况,程序一直等待,不再运行下去。
*/
class Resource
{private String name;private int num=0;boolean flag;public synchronized void set(String name){//if(flag)while(flag)try{this.wait();}catch (Exception e){}this.name=name+"_"+num++;System.out.println(Thread.currentThread().getName()+"生产者"+this.name);try{Thread.sleep(10);}catch (Exception e){}flag=true;//this.notify();this.notifyAll();}public synchronized void get(){//if(!flag)while(!flag)try{this.wait();}catch (Exception e){}System.out.println(Thread.currentThread().getName()+"消费者.............."+this.name);flag=false;//this.notify();this.notifyAll();}
}class Producer implements Runnable
{private Resource r;Producer(Resource r){this.r=r;}public void run(){while (true){r.set("商品");}}
}class Consumer implements Runnable
{private Resource r;Consumer(Resource r){this.r=r;}public void run(){while (true){r.get();}}
}class ProducerConsumerDemo 
{public static void main(String[] args) {Resource r=new Resource();Producer p=new Producer(r);Consumer c=new Consumer(r);Thread t1=new Thread(p);Thread t2=new Thread(p);Thread t3=new Thread(c);Thread t4=new Thread(c);t1.start();t2.start();t3.start();t4.start();System.out.println("Hello World!");}
}

这篇关于java 线程六-解决线程安全隐患问题-加锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1053657

相关文章

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2