首页 > 编程知识 正文

java中hashmap(Java各种集合的概念)

时间:2023-05-06 05:55:10 阅读:77579 作者:859

一、引言

在Java的开发过程中,往往涉及各种并发编程问题,但说到并发编程,需要特别关注线程安全问题。 虽然最近基于Jstorm开发日志处理程序,但由于Jstorm的特性,多线程随处可见。 因此,在程序中也需要特别关注线程安全问题。 这次项目开发过程中也出现了很多问题,通过不断查询资料,不断修改问题,学到了很多知识。 因此,我要写关于最近的同时编程的学习和总结。

二.多线程基础

在并发编程中,线程和锁定起着非常重要的作用,必须正确使用线程和锁定才能完成强健的并发程序。 我认为在我的实战过程中有两点需要我们特别注意。

对可变共享资源的操作

当前锁定对象

这两个地方如果不考虑清楚就很容易写线程不安全的代码。 将参照相关示例对此进行说明。

术语

共享资源:可由多个线程同时访问的资源

冲突条件:如果两个线程争用同一资源,对资源的访问顺序敏感的话,就称为有冲突条件

关键区域:导致冲突的代码

什么是线程安全?

在并发编程中我们最关心的是线程安全问题。 只有线程安全的程序在并发编程中是有用的。

那么,什么是线程安全呢?

如果访问具有多个线程的类时该类始终显示正确的行为,则该类称为线程安全。

上面的话给出了线程安全的定义,但是根据实际场景的不同,这个正确的行为可能会有所不同,需要开发主观的判断。 我在实战过程中往往会在每个操作的执行过程中考虑此时共享资源的所处状态,然后不断测试代码的执行,看看中间进程共享资源的实际状态,实现提前期的安全代码。

三.关于线程安全的实战

以上是基础知识的总结,接下来记录最近工作中遇到的问题。 基本上强调了两个注意事项。 下面的示例发现,编写线程安全代码时,在代码中对共享资源的操作以及在当前同步中获得的对象是什么非常重要。

将字符串常数作为对象锁

让我们再次考虑两个注意事项。 第一,什么是共享资源; 第二个当前对象锁是什么?

上图中的list集合是共享资源,同步代码块中是对共享的操作。 当前同步获取的锁定是字符串s。 因为在上图中创建的字符串直接存储在jvm的常量池中,而一个jvm中只存储一个。 因此,每个线程要访问同步代码块中的代码,必须获取字符串s的锁定。 因此,多个线程争用同一锁,一次只能有一个线程访问同步代码块中的代码。 也就是说,线程安全。

这次的代码只更改了很小一部分,但结果出乎意料。 现在,这个代码被编程为线程不安全。 这个问题发生的时候,我们也有点意外。

如果遇到问题,首先确定共享资源list在哪里操作,然后检查整个代码,可以看到只有图中同步代码块中的代码。 然后,所有共享资源的操作都在同步代码块中,并且共享资源的操作被确定为不是问题的关键。 那边应该是第二个条件对象锁出了问题。 与图1中的代码相比,图1中的线程安全的原因是只有一个对象,每个线程冲突同一对象锁,以确保同步代码块中只有一个线程同时执行代码。 因此,图2中的s对象不是唯一的,每个线程锁定的对象不同,从而可以同时推测多个线程正在执行同步代码块中的代码。

现在,我们来看看图2中字节码的反编译结果。

从图中可以看到,编译器处理字符串操作符,在连接两个字符串时编译器最终用StringBuilder的append方法连接,最后调用toString方法检索字符串,因此, 在此,由于各线程很容易将自己的StringBuilder对象new输出,所以在此,各线程获取的对象锁会产生作为自己的StringBuilder对象的线程的不安。

线程不安全,因为上面的示例主要使用了错误的锁定对象。

错误地使用this关键字

在使用同步的过程中经常看到同步(this )的写法。 在这里你应该要明白this真正代表的意思。 其中this表示当前对象,synchronized(this表示必须获取当前对象的锁定才能访问同步代码块中的对象。 因此,同步(this仅在多线程共享同一实例时适用。

四.总结

理论知识只有在实践过程中才能得到更深、更透彻的理解。 遇到程安全问题,明确两个重点排查问题的手段也非常实用。 并发编程的第一要务是安全,只有在安全的基础上才是性能。 总之,最近基于Jstorm开发程序加深了对多线程的理解。 工作中深入学习点滴技术。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。