
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
线程与进程都是程序员在学习Java编程语言的时候需要重点掌握的一些编程知识,而本文我们就通过案例分析来简单了解一下,Java编程线程安全分享。
避免数据共享
非常自然的我们能够想到一条,如果我们能够避免共享数据的话,每一条线程都使用各自的数据、不访问共享数据,那么一定就不会存在线程安全问题。
我们知道JAVA虚拟机在内存管理过程中将内存划分为不同区域,其中类成员变量存储在堆内存,方法变量存储在栈内存。堆内存在不同线程之间共享数据,有线程安全问题,而栈内存是线程独占的内存,不存在线程安全线问题。
所以,允许的情况下,不使用成员变量、而是用方法变量、临时变量的话,可以避免共享数据,从而确保数据的线程安全问题。
确保对共享数据的并发访问安全性
然而实际上我们很少有利用局部变量代替成员变量从而避免线程安全的机会,因为成员变量有他存在的理由和价值,为了避免线程安全问题而减少成员变量的使用,就是因噎废食,代码一定会丑陋不堪。
JAVA为我们提供了不同的线程安全问题解决方案,我们可以根据不同的场景采用不同的方案。包括voliate、synchronized关键字,以及ThreadLocal类,等等。
什么是轻量级同步机制
先,轻量级同步机制是和synchronized相比较而言的,由于synchronized的实现依赖于操作系统的线程管理机制,需要更多的系统资源调度才能实现,所以我们一般管他叫做重量级实现。相比而言,voliate是在JAVA世界的内部实现,是JAVA虚拟机内部自己就能解决的,所以我们管voliate叫轻量级同步机制。
内存可见性
理解voliate确保“内存可见性”,需要对JAVA内存模型JMM(JAVAMemeryModule)做一个简单的了解,记住,我们带着明确的目标去了解JMM,现在我们这个明确的目标是理解voliate的“内存可见性”的具体含义,所以我们不扩展不偏移目标,我们不是要了解整个JMM世界。
好了,我们带着这个明确的目标来了解一下JMM:JAVA内存模型约定,JAVA的内存分为主内存和工作内存,JAVA线程只能访问工作内存,各条线程都有自己的工作内存,而工作内存的数据均来源于主内存,JAVA线程从工作内存获取到数据、并对数据操作之后,必须将数据写回主内存才能使得操作生效。
多线程访问共享数据时,根据JMM的约定,共享数据存放在主内存,各线程访问时先从主内存读取数据到自己的工作内存,然后在自己的工作内存区对数据进行操作(比如+1),操作完成后再从自己的工作内存写入到主内存(+1后的值)以使得线程对该变量的操作生效。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。