java并发编程实例分析

 更新时间:2019年03月01日 10:33:05   投稿:laozhang  
在本文里我们给大家分享了关于java并发编程实例分析以及相关知识点,需要的朋友们学习下。

java并发编程是java程序设计语言的一块重点,在大部分的业务场景中都需要并发编程。

比如:并发的去处理http请求,这样就可以使得一台机器同时处理多个请求,大大提高业务的响应效率,从而使用用户体验更加流畅。

java如何并发编程,要注意以下几个方面:

1、java语言中的多线程操作:创建和启动线程的几种方式。

2、共享变量的同步问题,要保证线程安全,辨别哪些变量是线程安全的、那些变量是线程不安全的,对于不安全的变量我们要想办法让其同步,一般也就是加锁。

3、线程锁:包括方法锁和synchronized块的使用。

接下来就详细说一下这几个方面。

首先说创建线程的方式:一般有两种方式

定义一个线程类:实现Runnable接口、或者继承Thread,推荐是实现接口的方式。

启动线程的方式:

第一种:new Thread()的方式。

创建好的线程,然后通过new的方式启动线程,因为创建方式的不同,他们启动的方式也略微有些差别。

第二种:通过线程池的方式启动线程。JavaAPI提供了线程池技术,可以用池的原理,

去管理线程,池的技术在java中很常见,比如数据库连接池等。

具体细节可以参考如下的连接:

共享变量的问题:要明白什么变量最有可能出现线程安全问题。没错就是静态变量,静态变量

相当于C语言的全局变量,如果是public类型,谁都可以修改,所以这个时候就会出现

变量的线程安全问题。当然了私有变量也可能出现线程安全问题。

具体细节可以参考如下的连接:

主要来说一下线程锁的两种方式:

(1)首先定义一个MyBusiness类,此类中顶一个一个静态变量i,和一个静态方法,静态方法的功能是让i加1。

(2)然后定义一个线程类MyThread2,run方法中先让线程sleep 2毫秒,然后执行加1操作。

(3)定义测试类,测试类创建6000个MyThread2线程,然后sleep 1秒钟,执行输出,显示i的值。

(4)结果:从结果可以看出,此时出现了线程安全问题,就是说某些线程在加1操作时取到了脏数据,即

在某一个时间点,多个线程同时取到了某个相同的i值,然后去修改,结果导致在这几个线程中,只有最后一个

修改生效,而其他的则被覆盖掉了。

(5)解决方案一:方法锁,给add方法加锁,表示同一时间只能有一个方法的调用被允许运行,其他的线程等待锁的释放。

再次运行,发现变成了6000就是正确的了。

(6)解决方案二:synchronized代码块,我们重新定义一个方法add1,然后用synchronized代码块锁上MyBusiness类,

表示同一时间只能有一个线程操作MyBusiness类,其他线程必须等待锁的释放。

(7)查看结果,也得到了正确的输出。

相关文章

  • 详解IntelliJ IDEA2020.1和JDK14体验

    详解IntelliJ IDEA2020.1和JDK14体验

    这篇文章主要介绍了详解IntelliJ IDEA2020.1和JDK14体验,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • SpringBoot实现热部署的方式总结

    SpringBoot实现热部署的方式总结

    所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用,对于Java来说,热部署就是在运行时更新Java类文件,本文将深入探讨SpringBoot有哪些方式可以实现热部署,感兴趣的朋友可以小编一探讨学习
    2023-06-06
  • 教你怎么在win10环境下安装jdk8

    教你怎么在win10环境下安装jdk8

    今天教大家怎么在win10环境下安装jdk8,文中有非常详细的图文示例,对想要安装win10的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • java的SimpleDateFormat线程不安全的几种解决方案

    java的SimpleDateFormat线程不安全的几种解决方案

    但我们知道SimpleDateFormat是线程不安全的,处理时要特别小心,要加锁或者不能定义为static,要在方法内new出对象,再进行格式化,本文就介绍了几种方法,感兴趣的可以了解一下
    2021-08-08
  • 自定义注解实现Spring容器注入Bean方式(类似于mybatis的@MapperScans)

    自定义注解实现Spring容器注入Bean方式(类似于mybatis的@MapperScans)

    本文介绍了如何通过自定义注解@MyService和@MyServiceScans在SpringBoot项目中自动将指定包下的类注入Spring容器,详细解释了创建自定义注解、定义包扫描器ClassPathBeanDefinitionScanner的作用与实现
    2024-09-09
  • SpringBoot自定义MessageConverter与内容协商管理器contentNegotiationManager详解

    SpringBoot自定义MessageConverter与内容协商管理器contentNegotiationManag

    这篇文章主要介绍了SpringBoot自定义MessageConverter与内容协商管理器contentNegotiationManager的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • JavaWeb实现学生管理系统的超详细过程

    JavaWeb实现学生管理系统的超详细过程

    学生信息管理系统是针对学校人事处的大量业务处理工作而开发的管理软件,主要用于学校学生信息管理,下面这篇文章主要给大家介绍了关于JavaWeb实现学生管理系统的超详细过程,需要的朋友可以参考下
    2023-05-05
  • Java阻塞队列BlockingQueue基础与使用

    Java阻塞队列BlockingQueue基础与使用

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下
    2023-01-01
  • Java线程的停止实现原理详解

    Java线程的停止实现原理详解

    这篇文章主要介绍了Java线程的停止实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • 在spring中实例化bean无效的问题

    在spring中实例化bean无效的问题

    这篇文章主要介绍了在spring中实例化bean无效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02

最新评论