编写高效的java代码:常用的优化技巧之并发编程技巧

author author     2023-02-23     543

关键词:

​编写高效的Java代码:常用的优化技巧【一】​

​编写高效的Java代码:常用的优化技巧【二】​

​编写高效的Java代码:常用的优化技巧【三】之JVM调优​


一、使用并发集合和原子变量来减少竞争

在多线程并发执行的场景中,如果多个线程同时访问同一个共享资源,就会出现竞争条件,这会导致数据不一致或者程序异常。因此,使用并发集合和原子变量来减少竞争是非常必要的。

1.1 并发集合

并发集合是Java提供的一种线程安全的集合框架,包括ConcurrentHashMap、ConcurrentLinkedQueue、CopyOnWriteArrayList等。它们在实现上使用了锁分段技术,不同的元素被分配到不同的段中,不同的段可以由不同的线程同时访问,从而实现高效的并发操作。

以ConcurrentHashMap为例,它是一个线程安全的哈希表,支持高效的并发访问。可以使用putIfAbsent()方法来向ConcurrentHashMap中添加元素。该方法会检查哈希表中是否已经存在对应的键值对,如果不存在则添加。该方法的具体实现如下:

public V putIfAbsent(K key, V value) 
V v = map.get(key);
if (v == null)
v = map.putIfAbsent(key, value);

return v;

1.2 原子变量

原子变量是Java提供的一种线程安全的变量类型,可以保证对变量的操作是原子性的。常见的原子变量有AtomicInteger、AtomicLong、AtomicBoolean等。

以AtomicInteger为例,它可以用来替代int类型的变量,在多线程环境下保证线程安全。可以使用compareAndSet()方法来进行原子操作。该方法会比较当前的值是否等于预期值,如果相等则更新为新值。该方法的具体实现如下:

public final boolean compareAndSet(int expect, int update) 
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);

二、使用线程池和Future来提高并发性能

在高并发的场景中,使用线程池和Future来提高并发性能是非常必要的。

2.1 线程池

线程池是一个重要的并发编程工具,它可以重复利用已经创建的线程,避免频繁地创建和销毁线程所带来的开销。在Java中,可以使用ThreadPoolExecutor类来创建线程池。

下面是一个简单的线程池示例:

ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i < 100; i++)
final int taskIndex = i;
executorService.execute(() ->
// 执行任务
System.out.println("Task " + taskIndex + " executed.");
);

executorService.shutdown();

2.2 Future

Future是Java提供的一种异步编程工具,可以在执行耗时操作时返回一个Future对象,通过该对象可以获取操作结果。在高并发的场景中,使用Future可以提高代码的可读性和可维护性。

下面是一个简单的Future示例:

ExecutorService executorService = Executors.newFixedThreadPool(10);
Future<Integer> future = executorService.submit(() ->
// 执行耗时操作
return 1 + 2;
);
int result = future.get(); // 获取操作结果
System.out.println("Result: " + result);
executorService.shutdown();

三、避免使用阻塞调用和不必要的等待

在高并发的场景中,使用阻塞调用和不必要的等待会导致程序性能下降。因此,需要尽量避免使用阻塞调用和不必要的等待。

3.1 避免阻塞调用

在Java中,常见的阻塞调用有IO操作、synchronized关键字、Object.wait()等。可以使用NIO、Lock、Condition等代替这些阻塞调用,从而提高程序性能。

3.2 避免不必要的等待

在多线程并发执行的场景中,不必要的等待会导致程序性能下降。可以使用Lock和Condition来实现线程间的等待和通知。

下面是一个简单的Lock和Condition示例:

Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
int count = 0;

Thread t1 = new Thread(() ->
lock.lock();
try
while (count == 0)
condition.await(); // 等待

System.out.println("Count: " + count);
catch (InterruptedException e)
e.printStackTrace();
finally
lock.unlock();

);

Thread t2 = new Thread(() ->
lock.lock();
try
count = 1;
condition.signal(); // 通知
finally
lock.unlock();

);

t1.start();
t2.start();

总结:

本文介绍了一些常用的并发编程技巧,包括使用并发集合和原子变量来减少竞争、使用线程池和Future来提高并发性能、避免使用阻塞调用和不必要的等待等。在实际应用中,可以根据具体需求选择合适的并发编程工具和技巧,从而提高程序的性能和可维护性。

​编写高效的Java代码:常用的优化技巧【一】​

​编写高效的Java代码:常用的优化技巧【二】​

​编写高效的Java代码:常用的优化技巧【三】之JVM调优​

编写高效的java代码:常用的优化技巧

​​编写高效的Java代码:常用的优化技巧【二】​​​​编写高效的Java代码:常用的优化技巧【三】之JVM调优​​​​编写高效的Java代码:常用的优化技巧【四】之并发编程技巧​​1.代码结构优化代码结构优化是提高Java程序... 查看详情

spark系列(代码片段)

...JVM性能优化系列-(3)虚拟机执行子系统JVM性能优化系列-(4)编写高效Java程序JVM性能优化系列-(5)早期编译优化JVM性能优化系列-(6)晚期编译优化JVM性能优化系列-(7)深入了解性能优化SpringMVC系列:SpringMVC系列 查看详情

spark系列(代码片段)

...JVM性能优化系列-(3)虚拟机执行子系统JVM性能优化系列-(4)编写高效Java程序JVM性能优化系列-(5)早期编译优化JVM性能优化系列-(6)晚期编译优化JVM性能优化系列-(7)深入了解性能优化SpringMVC系列 查看详情

程序设计基石与实践系列之编写高效的c程序与c代码优化

原文出处:codeproject:WritingEfficientCandCCodeOptimization虽然对于优化C代码有非常多有效的指导方针,可是对于彻底地了解编译器和你工作的机器依旧无法取代,通常。加快程序的速度也会加大代码量。这些添加的代码也会影响一个程... 查看详情

git之常用的高效处理技巧(代码片段)

一、常见工作流程①GitFlow主干分支稳定分支开发分支补丁分支修改分支②GithubFlow创建分支添加提交提交PR请求讨论和评估代码部署检测合并代码③GitlabFlow带生产分支带环境分支带发布分支二、日常使用最佳实践使用命令行代替... 查看详情

java性能优化

...能受代码质量的直接影响。在本文中,主要介绍一些代码编写的小技巧和惯例,这些技巧有助于在代码级别上提升系统性能。1、慎用异常在Java软件开发中,经常使用try-catch进行错误捕获,但是,try-catch语句对系统性能而言是非... 查看详情

python核心并发编程之futures(代码片段)

无论对于哪门语言,并发编程都是一项很常用很重要的技巧正确合理地使用并发编程,无疑会让程序带来极大的性能提升。接下来学习理解、运用Python中的并发编程——Futures一、区分并发和并行在学习并发编程时,... 查看详情

java多线程之并发编程三大核心问题

...系统的强大计算能力,随着处理器数量的持续增长,如何高效的并发变得越来越重要。但是开发难,并发更难,因为并发程序极易出现bug,这些bug是比较诡异的,跟踪难,且难以复现。如果要解决这些问题就要正确的发现这些问... 查看详情

java并发编程之concurrenthashmap(代码片段)

引言ConcurrentHashMap是线程安全并且高效的HashMap,在并发编程中经常可见它的使用,在开始分析它的高并发实现机制前,先讲讲废话,看看它是如何被引入jdk的。为什么引入ConcurrentHashMap?HashMap线程不安全,... 查看详情

《java并发编程的艺术》之concurrentlinkedqueue(代码片段)

...这个数据结构已经很熟悉了,就不多介绍,主要还是根据代码理解DougLea大师的一些其他技巧。入队如图所示,很多人可能会很疑惑,为什么第一次入队后,TAIL没有指向Node2?答案是为了效率!Σ(っ°Д°;)っ那这还能叫队列吗?当... 查看详情

并发编程之synchronized------jvm对synchronized的优化(代码片段)

一、锁的粗化看如下代码publicclassTestStringBufferstb=newStringBuffer();publicvoidtest1()//jvm的优化,锁的粗化stb.append("1");stb.append("2");stb.append("3");stb.append("4");首先我们要清除StringBuffer是线程安全的,因为它在每一个方法上都加了sync 查看详情

javascript优化项目代码技巧之语言基础

...nbsp;  Javascript的弱类型以及函数作用域等规则使用编写Javascript代码极为容易,但是编写可维护、高质量的代码却变得十分困难,这个系列的文章将总结 查看详情

《effectivec#》系列之(零)——概要

...化集合的使用7.提高多线程的性能8.使用LINQ来提高效率9.编写高效的异步代码10.强制执行代码规范此书的核心内容是帮助C#程序员更好地理解和利用C#语言的功能,并编写出可读性、性能和可维护性都较高的代码。每个条目都包括... 查看详情

高效告别996,开启java高效编程之门3-7实战:常用中间操作演示之:过滤/映射/扁平化filter/map/flagmap

1    重点filter方法的使用map方法的使用flatMap方法的使用forEach方法的使用 2    map和flatMap的区别:map的作用很容易理解就是对rdd之中的元素进行逐一进行函数操作映射为另外一个rdd。flatMap的操作是将函数应用于rdd之... 查看详情

java并发编程之volatile(代码片段)

Java修饰一个变量为volatile后,其就具备2种特性:1.内存可见性2.禁止指令重排序优化 一、内存可见性是什么呢?volatile是保证共享变量变化可见性的关键字。所谓可见性,就是一个变量在多个线程间可见,而vo... 查看详情

6个必知必会高效python编程技巧

编写更好的Python代码需要遵循Python社区制定的最佳实践和指南。遵守这些标准可以使您的代码更具可读性、可维护性和效率。本文将展示一些技巧,帮助您编写更好的Python代码文章目录遵循PEP8风格指南1.遵守PEP8命名约定2.使... 查看详情

笔记效率之门——python中的函数式编程技巧(代码片段)

...baidu.com)python中函数式编程的一些技巧,可以提升我们编写代码的效率,写出更加清晰且高效的代码。开发者关心两个效率,程序运行的效率:程序用更少的计算资源完成更多的任务。编写代码的效率:程序员... 查看详情

解决并发编程之痛的良药--结构化并发编程(代码片段)

解决并发编程之痛的良药--结构化并发编程作者简介:曹家锋,Westar实验室技术专家。Westar实验室(westar.io),成立于2018年,关注于区块链及分布式前沿技术,包括区块链分层架构、二层路由,网络性能、智能合约、PoW优化等。... 查看详情