时间:2021-05-19
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)查看结果,也得到了正确的输出。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Java并发编程系列【未完】:•Java并发编程:核心理论•Java并发编程:Synchronized及其实现原理•Java
Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解在java1.5中,提供了一些非常有用的辅助类来帮助我们
学习Java并发编程不得不去了解一下java.util.concurrent这个包,这个包下面有许多我们经常用到的并发工具类,例如:ReentrantLock,
本文实例分析了Java中递归原理。分享给大家供大家参考。具体分析如下:解释:程序调用自身的编程技巧叫做递归。程序调用自身的编程技巧称为递归(recursion)
本文主要探究的是java并发编程callable与future的使用,分享了相关实例代码,具体介绍如下。我们都知道实现多线程有2种方式,一种是继承Thread,