java 并发编程实例_java并发编程实例分析

本文深入探讨了Java并发编程的关键点,包括线程的创建与启动(实现Runnable接口和继承Thread)、共享变量的线程安全问题及解决策略。文章通过实例展示了线程安全问题,如静态变量的并发修改,以及如何通过方法锁和synchronized块确保线程同步,以避免脏数据问题。最后,提出了线程池作为更高效的线程管理方式。
摘要由CSDN通过智能技术生成

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

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

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

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

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

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

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

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

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

5e0b882f95ecb76a8b735ae051be95dc.png

81efbdd5a5d8658dbc3a2478813c6518.png

启动线程的方式:

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

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

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

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

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

969dc2d4bc8213f8e44adc5a271f8f85.png

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

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

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

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

7d05f45842067ce476a1fcd35ba91e73.png

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

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

7197e0a0207fd15021a692d1dc103122.png

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

fced2786f8546f0b38855fa37d216ef8.png

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

410fad04e196e4494a9cda20a6d3edd2.png

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

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

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

17434f9ccd020dc4364facd1e517d667.png

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

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

26b64b0facf0b2a0cf431fbbf20159d7.png

d226292709b7cb1c110d88543f8b6262.png

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

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

140c2d419174d37bcacd678606712aa0.png

e56287e0ec0851918d02bf8cff749546.png

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

d38247723c07ebc680331d35a94bd915.png

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值