0 0

线程安全困惑20

看了线程并发的部分内容, , 发现自己晕了。哈哈,别喷,帮忙看下下面这个类是线程安全的吗?能不能解释下。 谢谢!!!

public class Demo {
	private volatile int x;

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}
}

问题补充:多个线程拥有该类的相同实例

问题补充:谢谢大家帮忙,:), 上面的应该是线程安全的。 第一次发帖,不知哪里可以给分,哈哈,错了勿怪。
2014年2月11日 16:35

10个答案 按时间排序 按投票排序

0 0

采纳的答案

毫无疑问,是线程安全的

2014年2月12日 11:18
0 0

是线程安全的。
别忘了,变量x有volatile修饰。

volatile修饰的变量是否是线程安全的,是有一定的前提的,就是对变量操作一定不能是复合操作。恰恰x是没有复合操作的。


如果有不理解的,请见我以前写的一片文章:http://jameswxx.iteye.com/blog/806968

2014年2月14日 16:21
0 0

天呀, 谁说是线程安全的, 误人子弟啊.

上面的这个程序只是保证了可见性

两个线程同时写, 仍然会有问题.

2014年2月14日 12:54
0 0

你的例子是线程安全的。 并且,去掉volatile 也是线程安全的。

因为你的程序中,只有对int型变量的 读、写操作,而按照Java虚拟机规范,所有对基本类型的操作,除了某些对long类型和double类型的操作之外,都是原子级的。

volatile 只是保证不同线程之间对变量修改的“可见性”。
即:在发生线程切换时,后面的线程能立即看到前面线程对变量的修改。

所以,除了long和double之外,线程安全是否取决于你的程序的语义:程序语义上是否要求连续的操作之间应保持一致性。(比如 在不同线程之间做一个计数器)

你的代码只是 get、set而已,就这两个操作来说,不存在线程安全问题。

2014年2月13日 09:07
0 0

我猜你的意思是说这个类的一个实例被多个线程同时访问,如果是这样的话,你应该用AtomicInteger才对,肯定不是线程安全的

2014年2月12日 21:46
0 0

  楼主可以参看下这个文章 http://www.ibm.com/developerworks/cn/java/j-jtp06197.html

2014年2月12日 10:32
0 0

只有在状态真正独立于程序内其他内容时才能使用 volatile,你代码里面的setX方法明显违背这条规则

2014年2月12日 09:53
0 0

问题没有描述清楚吧? 你这个类又没有类属性(静态属性) 多个线程拥有该类不同的实例,各自独立,怎么会有线程安全问题呢?  除非你是多个线程共用同一个该类的实例才会有线程安全问题啦

2014年2月11日 20:05
0 0

如果这个类供外部调用的话~就不算安全

2014年2月11日 17:29
0 0

volatile http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
不是线程安全的 他不是原子操作

https://www.google.com.hk/search?newwindow=1&safe=strict&espv=210&es_sm=93&q=java+volatile+stackoverflow&oq=java+volatile+stack&gs_l=serp.3.0.0j0i30j0i8i30l2.4702.6536.0.8430.6.6.0.0.0.0.147.503.5j1.6.0....0...1c.1j4.35.serp..0.6.502.gDgUzYfwiHE

2014年2月11日 16:55

相关推荐

    Java理论与实践:描绘线程安全性

    Java中的线程安全性是并发编程中的关键概念,它关乎到多线程环境下程序的稳定性和正确性。...在编写类的初期就记录其线程安全性,不仅可以避免未来的困惑,也有助于确保代码质量,使得维护和扩展变得更加容易。

    .Net线程示例

    2. **线程同步**:使用 `pthread_mutex_t` 类型的变量 `mut` 实现线程间的数据同步,确保 `number` 变量在多个线程中的安全访问。 3. **线程等待**:通过 `pthread_join` 函数等待线程结束。 综上所述,虽然提供的...

    java线程入门教程,涉及线程基本知识,显浅易懂..zip

    synchronized方法或代码块确保同一时刻只有一个线程可以执行,从而保证了线程安全。此外,`wait()`, `notify()`, `notifyAll()`是Object类的方法,用于线程间的通信,它们必须在`synchronized`代码块或方法中使用。 ...

    C#进度条(多线程+委托)新手教学

    通过以上介绍,你将能够理解如何在C#中利用多线程和委托实现一个进度条,同时掌握了如何在多线程环境中安全地更新UI。这个简单的DEMO对于初学者来说是一个很好的起点,可以进一步探索更复杂的并发和同步策略。

    gif动画等待线程.rar_等待 动画

    这些库都提供了事件驱动的机制,如Swing的Event Dispatch Thread (EDT),确保在UI线程中安全地更新组件。 3. **GIF解析和播放**:需要一个库或者自定义代码来解析GIF文件,并按照其帧序列逐帧显示动画。Java标准库并...

    易语言-易语言多线程adsl宽带拨号

    在描述中提到,有些易语言开发者可能对如何在多线程环境下进行拨号操作感到困惑,担心拨号过程会干扰到其他线程。解决这个问题的关键在于正确地管理和同步线程。一种常见的方法是使用线程同步机制,如互斥量、信号量...

    PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析

    相反,FastCGI执行模式,无论是与IIS 6还是IIS 7配合,都是基于单进程多请求的方式,每个请求在一个单独的进程中处理,所以不需要线程安全检查。因此,如果使用FastCGI,推荐选择Non Thread Safe版本,因为它可以...

    NC65进度条功能.rar

    4. **UI更新**:使用适当的方法(如Invoke或BeginInvoke)在主线程中安全地更新进度条控件,确保界面的同步和稳定性。 5. **异步编程**:.NET Framework 4.0及以上版本引入了Task和async/await关键字,使得异步编程...

    教会你如何用好单例及单例的定义

    - **枚举**:自Java 5起,使用枚举来实现单例模式被认为是一种既简单又高效的方式,因为枚举天然具备线程安全性和序列化机制。 #### 六、总结 单例模式在实际项目中有着广泛的应用,特别是在需要控制资源消耗、...

    菜鸟入门:Java语言学习六大要点(辅你成凤)

    然而,理解多线程原理和确保多线程安全对编写准确无误的程序至关重要。例如,在JSP中,编写位置的不同对多用户环境的安全性影响巨大;而Super Servlet则将每个访问视为一个进程,每个页面作为一个线程运行,与...

    Java解惑(中文).pdf

    书中将探讨并发编程的挑战,如线程同步、死锁、活锁等问题,以及如何使用synchronized、volatile关键字来确保线程安全。 3. **异常处理**:Java异常处理机制帮助开发者捕获和处理程序运行时错误。书里会解释如何...

    多核 编程 技术 指南

    1. 线程安全:在多线程环境中,确保数据一致性、避免竞态条件和死锁是关键。使用锁、信号量等同步机制可以解决这些问题。 2. 负载均衡:合理分配任务,避免某个核心过载,其他核心空闲。可以使用负载均衡算法动态...

    java解惑(罗列了95个容易让你迷惑的java知识点)

    19. **并发集合**:如ConcurrentHashMap、CopyOnWriteArrayList等,线程安全的集合类,提高了多线程环境下的性能。 20. **多路复用I/O**:Java NIO(Non-blocking I/O)提供了选择器和通道,允许单线程处理多个连接...

    windows2003未知帐户的删除

    在 Windows 2003 操作系统中,有一个未知帐户问题,出现于文件夹的“安全选项”里,名为“未知帐户(S-1-5-21-1482476501-412668190-682003330-1003)”,这引起了许多用户的困惑。下面我们将详细地介绍这个未知帐户的...

    Java六大关键是什么你知道吗

    对于开发者而言,更重要的是理解多线程的基本原理和如何确保多线程的安全性。 例如,在JSP中,不同的位置编写的代码对多个用户环境的安全性有着不同的影响。再比如SuperServlet与Servlet的多线程处理方式不同,这也...

    Thinking C++[C++编程思想][第1版和第2版

    荣获1996年度《软件开发》杂志的图书震撼大奖 (Jolt Award),成为该年度最佳图书。 本书内容: ·介绍实用的编程技术和最佳的实践... ·介绍被认为是标准C++下一版特征之一的多线程处理编程技术,并提供最新研究成果

    网络游戏-一种切换游戏对象的方法及装置.zip

    综上所述,"网络游戏-一种切换游戏对象的方法及装置"这一主题涵盖了游戏开发中的多个核心技术,包括但不限于对象管理、多线程、网络同步、缓存策略、UI设计、性能优化以及安全性。理解并掌握这些技术对于提升网络...

    IOS应用源码之【类库与框架】MBProgressHUD.rar

    MBProgressHUD 是线程安全的,可以在主线程或子线程中使用。通常,我们建议在主线程中显示和隐藏,而在子线程中执行耗时操作。 4. **自定义外观**: MBProgressHUD 允许开发者自定义其外观,包括颜色、大小、动画...

Global site tag (gtag.js) - Google Analytics