java多线程读一个变量需要加锁吗?

  1. 如果只是读操作,没有写操作,则可以不用加锁,此种情形下,建议变量加上final关键字;
  2. 如果有写操作,但是变量的写操作跟当前的值无关联,且与其他的变量也无关联,则可考虑变量加上volatile关键字,同时写操作方法通过synchronized加锁;
  3. 如果有写操作,且写操作依赖变量的当前值(如:i++),则getXXX和写操作方法都要通过synchronized加锁。
时间: 2024-11-13 06:54:54

java多线程读一个变量需要加锁吗?的相关文章

java多线程(对象和变量的并发访问)

在现实开发中,我们写的线程肯定会有不同的实例在执行,此时就可能会出现"非线程安全问题",非线程安全就是:多个线程对同一个对象中的实例变量进行并发访问时候,有可能A和B线程同时读取到数据,先后进行更改,此时,该变量就不是我们期望的数据,也就是通常所说的"脏数据" 实例变量非线程安全 需要注意的是,方法中的变量是不存在非线程安全问题的,这是因为方法内部的变量都是私有的. 如果多个线程共同访问了一个对象中的实例变量,则可能会出现线程安全问题.看下面代码: public c

Java多线程:volatile变量、happens-before关系及内存一致性

什么是 Volatile 变量?Volatile 是 Java 中的一个关键字.你不能将它设置为变量或者方法名,句号. 认真点,别开玩笑,什么是 Volatile 变量?我们应该什么时候使用它?哈哈,对不起,没法提供帮助. volatile 关键字的典型使用场景是在多线程环境下,多个线程共享变量,由于这些变量会缓存在 CPU 的缓存中,为了避免出现内存一致性错误而采用 volatile 关键字. 考虑下面这个生产者/消费者的例子,我们每次生成/消费一个元素: 1 2 3 4 5 6 7 8 9

java多线程-读写锁

Java5 在 java.util.concurrent 包中已经包含了读写锁.尽管如此,我们还是应该了解其实现背后的原理. 读/写锁的 Java 实现(Read / Write Lock Java Implementation) 读/写锁的重入(Read / Write Lock Reentrance) 读锁重入(Read Reentrance) 写锁重入(Write Reentrance) 读锁升级到写锁(Read to Write Reentrance) 写锁降级到读锁(Write to

Java多线程之对写业务加锁,对读业务不加锁,会产生脏读

1 import java.util.concurrent.TimeUnit; 2 3 /** 4 * 对写业务加锁 5 * 对读业务不加锁 6 * 脏读 7 */ 8 public class Account { 9 10 String name; 11 double balance; 12 13 public synchronized void set(String name, double balance) { 14 this.name = name; 15 try { 16 Thread

Java多线程中static变量的使用

有时候,对于在多线程中使用static变量有没有冲突,是否存在安全问题不能十分的确定.在使用过程中有点含糊,总想找点时间好好追究一下,可总因开发项目时间的紧迫而搁浅.我想,没有做进一步的研究而拿项目繁忙说事,这是自己的借口吧! 鲁迅先生曾说过:"时间就像海绵里的水,只要愿挤,总还是有的".不管肿(怎)么说,这事还是要做的啊.如果越往后推,可能造成的潜在影响更大.这始终是个隐患,不能不除. 不是痛定思痛,而是认识到事情的重要性,就要开始行动了... ... 以上是个人的闲言碎语,不足而看

Java多线程编程:变量共享分析(Thread)

在编写多线程程序时,最重要的就是搞清楚哪些变量是共享的,哪些变量是不共享的.也就是要分析清楚其中的原理呀. 因为最近要使用多线程就看了一些,对使用Thread类的子类创建线程的情况,总结如下: 1.方法体内部定义的局部变量不共享 这是因为方法内部定义的变量是在运行时动态生成的.每个线程都有一个自己的堆栈,用于保存运行时的数据. 最容易理解的就是递归调用时候,每次的入栈出栈操作.如下,每次调用时,变量aa都是在运行时堆栈上保存的,方法结束变量也就释放了. public int fib(int n)

java多线程核心技术梳理(附源码)

java多线程核心技术梳理(附源码) java多线程核心技术梳理附源码 写在前面 java多线程 对象及变量的并发访问 线程间通信 Lock的使用 定时器 单例模式与多线程 拾遗补增 参考资料 本文对多线程基础知识进行梳理,主要包括多线程的基本使用,对象及变量的并发访问,线程间通信,lock的使用,定时器,单例模式,以及线程状态与线程组. 写在前面 花了一周时间阅读<java多线程编程核心技术>(高洪岩 著),本文算是此书的整理归纳,书中几乎所有示例,我都亲手敲了一遍,并上传到了我的githu

(转载)Java多线程入门理解

转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 目录(?)[-] 一扩展javalangThread类 二实现javalan

Java多线程学习

写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线