共享资源(或称临界资源)问题:多个线程同时修改同一个数据(资源),导致最终结果不正确,这是典型的由于并发访问所产生的问题。
线程的内存结构:
当我们每启动一个线程,每个线程都会有一个它自己的栈,所以对于局部变量,不存在并发访问问题,但“堆”和“方法区”是所有线程共享的,所以,如果我们在多个线程中访问在“堆”中的同一个对象的数据时,或者访问静态变量时,就会产生并发访问问题
某个线程类:
public class MyThread extends Thread {
public MyThread(String name){
super(name);
}
@Override
public void run() {
SomeClass sc = new SomeClass();
sc.dosomething();
}
}
客户端:
public class MyThreadClient {
public static void main(String[] args) {
MyThread mt = new MyThread("我的线程");
mt.start();
SomeClass sc = new SomeClass();
sc.dosomething();
}
}
SomeClass资源类:
public class SomeClass {
private int id;
private String name;
public void dosomething(){
int i = 0;
for(;i<23;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
不存在共享资源的问题:
因为每个线程用的是他自己的对象,都有他自己的空间,不存在线程安全的问题。
即使两个线程同时进入到SomeClass中的dosomething()方法中,因为i是局部变量,又是两个不同的对象,因此是没有线程安全问题的。
在下面虽然都是用的是同一个SomeClass的对象,已经访问到同一个共享资源,但是他不存在线程安全的问题。
当我们访问这个方法的时候并没有用到共享资源,因为访问同一个对象时,这个对象时共享资源,那么这个对象的属性是共享的。但是对于局部变量,这些线程他不是共享的。比如一个线程进入dosomething这个方法时,可以知道这个方法会创建一个栈帧,然后在这个栈里边压入i这个局部变量并保存在栈中,当有另外一个线程进来时会再创建一个栈帧并压入i这个局部变量,因此从内存分析来看,这是两个不同栈帧中的不同变量,因此i这个局部变他不是共享的资源,代码如下所示:
Someclass中的部分代码:
for(;i<500;id++){ System.out.println(Thread.currentThread().getName()+":"+i);
}
具体的线程类:
public class MyThread extends Thread {
private SomeClass sc;
public MyThread(String name, SomeClass sc) {
super(name);
}
@Override
public void run() {
sc.dosomething();
}
}
客户端:
public static void main(String[] args) {
SomeClass sc = new SomeClass();
MyThread mt = new MyThread("我的线程",sc);
mt.start();
sc.dosomething();
}
现在把i局部变量改成SomeClass中的属性id的话,这个实例变量两个线程都共享他,这是就会出现共享资
源的问题,因为id是两个线程共享的变量。假设两个线程同时进来的话,稍微后进来的那个线程的id值就不
一定是从0开始了,以后输出的值也就会混乱了,就没有那么顺序的++1的递增输出
分享到:
相关推荐
多线程不同步读写共享资源 文章配套代码 我在很早的时候就听说多线程不同步是可以读写共享资源的。这听起来感觉挺好,因为一旦同步线程,将在同步线程上花去一定的CPU时间片. 这一切都是真的,但是,不同步线程的...
在进行多线程开发时最令人头痛的问题估计就是对共享资源的控制了吧,今天就让我们谈一谈这个问题吧。 共享资源顾名思义就是需要被多个线程使用的资源,但是很多情况下我们是不能允许多个线程同时使用这个资源的。这...
- 避免在线程之间共享复杂的Qt对象,除非使用`QThread::moveToThread()`移动对象。 总结,Qt5的多线程机制是通过QThread类实现的,它允许开发者创建独立的工作线程来处理后台任务,从而保持主线程的流畅性。`...
2. **同步机制**:当一个线程完成对共享资源的操作后,必须释放Semaphore,增加其计数值,以便其他等待的线程可以继续执行。这样,Semaphore就充当了线程间的协调者,确保资源的有序访问。 3. **避免死锁**:通过...
`synchronized`关键字是Java中用来控制多线程并发访问共享资源的一种机制。它提供了互斥访问,确保同一时间只有一个线程可以执行特定代码块。`synchronized`可以修饰方法或者代码块,当一个线程进入`synchronized`...
QSemaphore提供了一种计数信号量机制,它维护一个非负整数值,允许特定数量的线程访问共享资源。当资源可用时,线程可以获取(acquire)一个许可证,然后访问资源;当资源被使用后,线程释放(release)许可证,使...
"ThreadLocked多线程共享资源"这个主题,就是探讨如何在C#中有效地管理和保护这些共享数据,以确保线程安全。 一、线程锁概念 线程锁是一种同步机制,用于限制对特定代码段的并发访问。在C#中,主要的线程锁包括`...
在.NET环境中,多线程编程是一项重要的技能,尤其当涉及到并发访问共享资源时。本文档深入探讨了.NET平台上的多线程资源共享与访问机制,并详细介绍了一个自定义类`ThreadLockHelper`,该类能有效地管理线程间的资源...
本文档“医疗多线程共享资源分配处理方法及系统”深入探讨了如何在医疗环境中利用多线程技术优化资源分配,提高系统的响应速度和整体性能。 一、多线程基础 1. 多线程概念:多线程是指在一个进程中可以同时存在多...
1. 锁(Lock):确保同一时间只有一个线程能访问特定的共享资源。 2. 条件变量(Condition Variable):用于线程间通信,当满足特定条件时,一个线程可以唤醒另一个线程。 3. 信号量(Semaphore):控制对共享资源的...
线程是进程中的执行单元,共享进程的地址空间和资源。 8. Windows API:Windows API是Windows操作系统提供的一组系统调用,用于实现应用程序的开发。Windows API提供了大量的函数和数据类型,用于实现各种操作系统...
2. **共享资源**:在多线程环境中,多个线程可能需要访问同一个数据或对象,这就形成了共享资源。 3. **竞态条件**:当两个或多个线程同时访问并修改共享资源时,如果没有适当的同步措施,可能导致数据的不一致性,...
1. **共享资源**:首先,我们需要一个共享的数据结构,例如一个队列,来存储生产者产生的数据。这个队列需要是线程安全的,因此可以使用Qt提供的`QMutex`来保护。 2. **生产者线程**:生产者线程会生成数据并尝试将...
众所周知, 在多线程中,因为共享全局变量,会导致资源修改结果不一致,所以需要加锁来解决这个问题,保证同一时间只有一个线程对资源进行操作 但是在分布式架构中,我们的服务可能会有n个实例,但线程锁只对同一个...
标题"Qt 多线程访问同一个变量"涉及到的是如何在多线程环境下确保对共享资源(此处为一个全局变量)的安全访问。描述中提到了使用互斥锁来解决这个问题,并通过创建两个线程ThreadA和ThreadB来演示这一过程。 首先...
在IT领域,多线程操作共享文件是一项关键的技术,尤其在并发编程中。Delphi作为一款强大的面向对象的 Pascal 编程环境,提供了丰富的工具和类库来支持这样的任务。本压缩包“多线程操作共享文件.zip”显然是一个关于...
通常,我们更倾向于使用互斥量(Mutex)、信号量(Semaphore)或 Monitor 类等同步原语来控制线程访问共享资源,而非直接挂起线程。 2. **休眠线程**: 休眠线程是让线程暂时停止执行,等待一段时间后再继续。C#...
线程总是属于某个进程,并且同一进程内的多个线程共享该进程的内存资源。 **2. Java中的线程** 在Java中,“线程”主要涉及两个方面: - **java.lang.Thread类的实例**:表示线程对象,拥有自己的变量和方法,...
QMutex提供独占锁,确保同一时间只有一个线程能访问资源;而QReadWriteLock则支持读写锁,允许多个读取线程同时访问,但在写入时会阻塞所有读写线程。 以下是一个简单的示例,展示了如何在多线程中使用全局缓冲区:...
互斥锁是一个二元变量,其状态为开锁(允许0)和上锁(禁止1),将某个共享资源与某个特定互斥锁绑定后,对该共享资源的访问如下操作: (1)在访问该资源前,首先申请该互斥锁,如果该互斥处于开锁状态,则申请到该...