先看一个非线程安全类的例子:
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);
}
}
分享到:
相关推荐
` 会使线程暂停1秒钟。这是一种简单的方式来控制线程的执行时间,但要注意,频繁地使用`Sleep`可能会影响线程的响应性和系统的整体性能。 ### 调整线程优先级 线程优先级决定了线程获得CPU时间的顺序。在C#中,...
例如,`sleep(1000)`会让线程休眠1秒钟。 挂起(Suspend)和恢复(Resume)操作在某些旧的多线程API中存在,但它们通常不推荐使用,因为它们可能导致死锁。挂起线程会使它进入阻塞状态,不再占用CPU,而恢复线程则...
使用`volatile`关键字声明`m_bRun`是为了确保编译器不会对它的读写操作进行优化,从而确保线程安全。 #### 四、总结 通过以上示例和解析,我们可以看到单线程程序与多线程程序之间的区别以及如何在Windows环境下...
然而,使用多线程也需要考虑线程安全、资源管理和调度等复杂问题。通过熟练掌握`Thread`类和相关的线程同步机制,开发者可以更好地利用多核处理器的优势,优化应用程序的性能。对于更多关于C#多线程的知识,你可以...
比如,可以定义一个委托类型,声明一个使用该委托类型的事件,然后在新线程中每隔1秒钟触发这个事件。这在ASP.NET中通常用于实现后台任务,如定时更新缓存、发送邮件等。 在给定的文件列表中,我们看到了几个关键...
这个例子中,TMyThread类创建了一个TTimer,当线程启动时,计时器开始计时,每秒钟触发一次TimerTick事件,然后在主线程中更新UI上的时间显示。 通过这个“Delphi多线程Demo”,我们可以学习到如何在Delphi中有效地...
在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,提升系统效率。...在深入学习过程中,还需要理解线程安全、同步机制、死锁等问题,以便在实际项目中更加熟练地运用多线程技术。
2. **线程安全**:如果时钟任务需要访问共享数据,必须保证线程安全,防止竞态条件和数据不一致。 3. **资源管理**:线程占用系统资源,长时间运行的线程可能会影响系统性能,因此需合理控制和管理。 4. **线程...
在Java编程语言中,多...同时,还涉及到了线程安全和并发控制的基本概念。通过理解这个例子,你可以进一步深入学习Java的多线程编程,包括线程通信、同步机制以及更高级的并发工具,如`ExecutorService`和`Future`。
1. **线程安全**:由于`QTimer`的`timeout()`信号是在创建它的线程中发射的,因此如果在子线程中创建了`QTimer`,那么`timeout()`信号也会在子线程中发射。确保与定时器交互的所有代码都是线程安全的,尤其是在修改...
在MFC多线程编程中,Microsoft Foundation Classes (MFC) 提供了一套封装好的类和方法,使得Windows下的多线程编程变得更加方便和高效。本文将详细介绍MFC多线程编程中的几个关键知识点,包括多线程基础、创建线程、...
在Qt库中,QTimer是一个...总的来说,`QTimer`在子线程中的使用需要遵循Qt的线程安全规则,保证子线程有事件循环,并正确管理线程生命周期。这样,我们就可以利用`QTimer`在子线程中定时执行任务,提高程序的并发性能。
### Windows下多线程编程基础 #### 多线程编程概览 在现代操作系统中,尤其是像Windows这样的桌面操作系统,支持多任务处理是...此外,还需要注意线程安全性和同步等问题,以避免出现竞态条件和其他并发相关的错误。
2. **StringBuffer类**:在多线程环境中,StringBuffer是一个线程安全的类,用于字符串操作。相比StringBuilder,它在多个线程同时进行字符串拼接时能避免数据不一致的问题。 3. **线程sleep()方法**:线程的sleep...
在`ThreadFunction`方法中,线程会先输出自己的状态,然后暂停1秒钟,最后输出一条完成消息。 通过这个例子,可以看到多线程编程的基本流程,以及如何控制线程的状态和行为。随着对多线程编程的深入学习,开发者...
这里需要注意的是,多线程环境下要时刻关注线程安全问题,以及避免死锁等问题。 文档中也提到了一些网址,例如***,这可能是提供相关课程或是资源链接的网站,学习者可以从中获取更多的学习资料和实践案例。 通过...
### 什么是线程? 在计算机科学中,**线程**是指程序执行中的...通过上述方法和工具,开发者可以在Java中有效地创建和管理线程,以实现复杂的并发执行逻辑,提高程序的性能和响应能力,并确保线程之间的安全和协调。
这种方法避免了直接在线程中操作UI,因此更符合Swing的线程安全规则。 线程的创建有两种基本方式: 1. 继承`Thread`类:创建一个新的类,继承`Thread`,并覆盖`run()`方法。然后创建该类的实例并调用`start()`方法...
6. **线程安全消息队列**: MFC中的`PostThreadMessage`函数允许线程间发送消息,确保消息安全地添加到目标线程的消息队列中,而不会被其他线程干扰。 通过上述步骤,你可以创建一个简单的MFC多线程程序,其中包含一...
使用 `Synchronize` 或 `Queue` 方法确保线程安全地与主线程交互,避免出现线程同步问题。这个简单的范例为理解 Delphi 中的多线程编程提供了一个基础的起点。在实际项目中,你还需要考虑更多的细节,如错误处理、...