`
287854442
  • 浏览: 48007 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

1秒钟非线程安全类变线程安全类

阅读更多
先看一个非线程安全类的例子:
package info.yiwen.thread.safe;
/**
 * 该类是非线程安全类,因为有一个共享变量state。
 * 
 * 原因:当多个线程使用同一个NotThreadSafe类的一个对象时,
 * 也会共享该对象的state属性,故是非线程安全的。
 * 
 * 也因为该类是非线程安全的,所以该类也不能作为单例对象。
 * 
 * 但是稍加改造也可以成为线程安全的,改造的方法有使用ThreadLocal,使用同步等等
 * 
 * 项目名称:ThreadSafeClass  
 * 类名称:NotThreadSafe  
 * 类描述:暂无
 * 创建人:xueshishasha  
 * 创建时间:2012-6-7 下午09:58:13  
 * 修改备注:
 * @version
 */
public class NotThreadSafe {
	private boolean state;

	public boolean checkState() {
		return isState();
	}
	
	public boolean isState() {
		return state;
	}

	public void setState(boolean state) {
		this.state = state;
	}
}


下面就稍加改造变成线程安全类:
方法1:使用ThreadLocal
package info.yiwen.thread.safe;

/**
 * 该对象是一个线程安全的对象,他虽然有一个state属性,但是是放在ThreadLocal里的,
 * 也就是说表面上看state属性是属于本类的,其实是属于当前线程的。
 * 
 * 因为每个线程实际上拥有一个state的副本,因此,state属性是不共享的,除此之外,该类也没有其他的共享的属性,
 * 因此该类是线程安全的,可以作为单例对象。
 * 
 * 
 * 项目名称:ThreadSafeClass  
 * 类名称:ThreadSafeWithThreadLocal  
 * 类描述:暂无
 * 创建人:xueshishasha  
 * 创建时间:2012-6-7 下午10:02:35  
 * 修改备注:
 * @version
 */
public class ThreadSafeWithThreadLocal {
	private final static ThreadLocal<Boolean> state = new ThreadLocal<Boolean>();
	
	public ThreadSafeWithThreadLocal(boolean state) {
		this.state.set(state);
	}
	
	public boolean checkState() {
		return state.get();
	}

	public boolean getState() {
		return this.state.get();
	}

	public void setState(boolean state) {
		this.state.set(state);
	}
	
	
}


方法2:使用同步关键字synchronized
package info.yiwen.thread.safe;


/**
 * 该类也是线程安全的,该类有一个共享属性state,但是对state状态进行写的方法上都用了sysnchronized同步语句
 * 
 * 项目名称:ThreadSafeClass  
 * 类名称:ThreadSafeWithSynchronized  
 * 类描述:暂无
 * 创建人:xueshishasha  
 * 创建时间:2012-6-7 下午10:13:50  
 * 修改备注:
 * @version
 */
public class ThreadSafeWithSynchronized {
	
	private Boolean state;
	
	public boolean checkState() {
		return state;
	}

	public boolean isState() {
		return state;
	}

	public void setState(boolean state) {
		synchronized (this.state) {
			this.state = state;
		}
	}
	
	
}


方法3:使用锁
package info.yiwen.thread.safe;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


/**
 * 该类也是线程安全的,该类有一个共享属性state,但是对state状态进行写的方法上都用了lock锁同步
 * 
 * 项目名称:ThreadSafeClass  
 * 类名称:ThreadSafeWithSynchronized  
 * 类描述:暂无
 * 创建人:xueshishasha  
 * 创建时间:2012-6-7 下午10:13:50  
 * 修改备注:
 * @version
 */
public class ThreadSafeWithLock {
	
	private Boolean state;
	
	private final Lock lock = new ReentrantLock();
	
	public boolean checkState() {
		return state;
	}

	public boolean isState() {
		return state;
	}

	public void setState(boolean state) {
		lock.lock();
		try {
			this.state = state;
		} finally {
			lock.unlock();
		}
	}
	
	
}


方法4:使用Atomic类型
package info.yiwen.thread.safe;

import java.util.concurrent.atomic.AtomicBoolean;

/**
 * 该类是线程安全的,该类有一个属性,是用AtomicBoolean实现的,
 * Atomic类型会维护好线程安全以及他所持有的值的访问权限
 * 
 * 项目名称:ThreadSafeClass  
 * 类名称:ThreadSafeWithAtomicType  
 * 类描述:暂无
 * 创建人:xueshishasha  
 * 创建时间:2012-6-7 下午10:59:26  
 * 修改备注:
 * @version
 */

public class ThreadSafeWithAtomicType {
	private AtomicBoolean state = new AtomicBoolean();
	
	public boolean checkState() {
		return state.get();
	}

	public boolean getState() {
		return state.get();
	}

	public void setState(boolean state) {
		this.state.set(state);
	}
}

分享到:
评论

相关推荐

    关于C# 多线程学习

    ` 会使线程暂停1秒钟。这是一种简单的方式来控制线程的执行时间,但要注意,频繁地使用`Sleep`可能会影响线程的响应性和系统的整体性能。 ### 调整线程优先级 线程优先级决定了线程获得CPU时间的顺序。在C#中,...

    线程间的调用

    例如,`sleep(1000)`会让线程休眠1秒钟。 挂起(Suspend)和恢复(Resume)操作在某些旧的多线程API中存在,但它们通常不推荐使用,因为它们可能导致死锁。挂起线程会使它进入阻塞状态,不再占用CPU,而恢复线程则...

    window多线程编程

    使用`volatile`关键字声明`m_bRun`是为了确保编译器不会对它的读写操作进行优化,从而确保线程安全。 #### 四、总结 通过以上示例和解析,我们可以看到单线程程序与多线程程序之间的区别以及如何在Windows环境下...

    C#(asp.net)多线程用法示例(可用于同时处理多个任务)

    然而,使用多线程也需要考虑线程安全、资源管理和调度等复杂问题。通过熟练掌握`Thread`类和相关的线程同步机制,开发者可以更好地利用多核处理器的优势,优化应用程序的性能。对于更多关于C#多线程的知识,你可以...

    WebDelegate_线程(在Web中使用线程+委托)

    比如,可以定义一个委托类型,声明一个使用该委托类型的事件,然后在新线程中每隔1秒钟触发这个事件。这在ASP.NET中通常用于实现后台任务,如定时更新缓存、发送邮件等。 在给定的文件列表中,我们看到了几个关键...

    Delphi多线程Demo

    这个例子中,TMyThread类创建了一个TTimer,当线程启动时,计时器开始计时,每秒钟触发一次TimerTick事件,然后在主线程中更新UI上的时间显示。 通过这个“Delphi多线程Demo”,我们可以学习到如何在Delphi中有效地...

    java多线程设置线程休眠案例

    在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,提升系统效率。...在深入学习过程中,还需要理解线程安全、同步机制、死锁等问题,以便在实际项目中更加熟练地运用多线程技术。

    线程的时钟

    2. **线程安全**:如果时钟任务需要访问共享数据,必须保证线程安全,防止竞态条件和数据不一致。 3. **资源管理**:线程占用系统资源,长时间运行的线程可能会影响系统性能,因此需合理控制和管理。 4. **线程...

    三线程分别显示各自时间

    在Java编程语言中,多...同时,还涉及到了线程安全和并发控制的基本概念。通过理解这个例子,你可以进一步深入学习Java的多线程编程,包括线程通信、同步机制以及更高级的并发工具,如`ExecutorService`和`Future`。

    QT在子线程中调用定时器

    1. **线程安全**:由于`QTimer`的`timeout()`信号是在创建它的线程中发射的,因此如果在子线程中创建了`QTimer`,那么`timeout()`信号也会在子线程中发射。确保与定时器交互的所有代码都是线程安全的,尤其是在修改...

    MFC多线程编程.pdf

    在MFC多线程编程中,Microsoft Foundation Classes (MFC) 提供了一套封装好的类和方法,使得Windows下的多线程编程变得更加方便和高效。本文将详细介绍MFC多线程编程中的几个关键知识点,包括多线程基础、创建线程、...

    LanScan (多线程的局域网扫描组).zip_多线程 delphi_局域网_局域网扫描

    1. **多线程技术**: 多线程是程序设计中的一个重要概念,特别是在网络编程中。它允许程序同时执行多个任务,提高系统的并发性。在LanScan中,多线程被用来并行扫描不同的IP地址,显著减少了整体的扫描时间。通过...

    QTimer在子线程里执行例子

    在Qt库中,QTimer是一个...总的来说,`QTimer`在子线程中的使用需要遵循Qt的线程安全规则,保证子线程有事件循环,并正确管理线程生命周期。这样,我们就可以利用`QTimer`在子线程中定时执行任务,提高程序的并发性能。

    Windows下多线程编程基础

    ### Windows下多线程编程基础 #### 多线程编程概览 在现代操作系统中,尤其是像Windows这样的桌面操作系统,支持多任务处理是...此外,还需要注意线程安全性和同步等问题,以避免出现竞态条件和其他并发相关的错误。

    Java面向对象程序设计与系统开发线程处理PPT教案学习.pptx

    2. **StringBuffer类**:在多线程环境中,StringBuffer是一个线程安全的类,用于字符串操作。相比StringBuilder,它在多个线程同时进行字符串拼接时能避免数据不一致的问题。 3. **线程sleep()方法**:线程的sleep...

    C#多线程编程速成

    在`ThreadFunction`方法中,线程会先输出自己的状态,然后暂停1秒钟,最后输出一条完成消息。 通过这个例子,可以看到多线程编程的基本流程,以及如何控制线程的状态和行为。随着对多线程编程的深入学习,开发者...

    2012年计算机二级Java多线程的概念学习教程.pdf

    这里需要注意的是,多线程环境下要时刻关注线程安全问题,以及避免死锁等问题。 文档中也提到了一些网址,例如***,这可能是提供相关课程或是资源链接的网站,学习者可以从中获取更多的学习资料和实践案例。 通过...

    什么是线程?Java中如何创建和管理线程?(java面试题附答案).txt

    ### 什么是线程? 在计算机科学中,**线程**是指程序执行中的...通过上述方法和工具,开发者可以在Java中有效地创建和管理线程,以实现复杂的并发执行逻辑,提高程序的性能和响应能力,并确保线程之间的安全和协调。

    Java实验五线程.pdf

    这种方法避免了直接在线程中操作UI,因此更符合Swing的线程安全规则。 线程的创建有两种基本方式: 1. 继承`Thread`类:创建一个新的类,继承`Thread`,并覆盖`run()`方法。然后创建该类的实例并调用`start()`方法...

    MFC创建线程

    6. **线程安全消息队列**: MFC中的`PostThreadMessage`函数允许线程间发送消息,确保消息安全地添加到目标线程的消息队列中,而不会被其他线程干扰。 通过上述步骤,你可以创建一个简单的MFC多线程程序,其中包含一...

Global site tag (gtag.js) - Google Analytics