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

线程:共享资源(一)

阅读更多
共享资源(或称临界资源)问题:多个线程同时修改同一个数据(资源),导致最终结果不正确,这是典型的由于并发访问所产生的问题。
线程的内存结构:
当我们每启动一个线程,每个线程都会有一个它自己的栈,所以对于局部变量,不存在并发访问问题,但“堆”和“方法区”是所有线程共享的,所以,如果我们在多个线程中访问在“堆”中的同一个对象的数据时,或者访问静态变量时,就会产生并发访问问题
某个线程类:
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时间片. 这一切都是真的,但是,不同步线程的...

    [Java]多线程:共享资源同步——不认真看你会后悔的

    在进行多线程开发时最令人头痛的问题估计就是对共享资源的控制了吧,今天就让我们谈一谈这个问题吧。 共享资源顾名思义就是需要被多个线程使用的资源,但是很多情况下我们是不能允许多个线程同时使用这个资源的。这...

    多线程资源共享集合

    多线程资源共享,synchronized,Runnable,Thread

    使用redis分布式锁解决并发线程资源共享问题

    众所周知, 在多线程中,因为共享全局变量,会导致资源修改结果不一致,所以需要加锁来解决这个问题,保证同一时间只有一个线程对资源进行操作 但是在分布式架构中,我们的服务可能会有n个实例,但线程锁只对同一个...

    ThreadLocked多线程共享资源

    C#通过多线程加锁ThreadLocked多线程共享资源的多种方法。

    Linux 线程间同步机制

    互斥锁是一个二元变量,其状态为开锁(允许0)和上锁(禁止1),将某个共享资源与某个特定互斥锁绑定后,对该共享资源的访问如下操作: (1)在访问该资源前,首先申请该互斥锁,如果该互斥处于开锁状态,则申请到该...

    NET中多线程间资源共享与访问

    NET中多线程间资源共享与访问

    java并发编程:线程基础

    线程的同步与阻塞: 引入多线程访问共享资源可能导致的问题,如竞态条件和数据不一致。介绍如何使用 synchronized 关键字来实现线程的同步和阻塞。 线程间通信: 详解线程间通信的方法,包括 wait、notify 和 ...

    C# socket多线程编程

    所谓单个写入程序/多个阅读程序的线程同步问题,是指任意数量的线程访问共享资源时,写入程序(线程)需要修改共享资源,而阅读程序(线程)需要读取数据。在这个同步问题中,很容易得到下面二个要求: 1) 当一个...

    linux之线程同步一.doc

    在Linux中,线程同步是一种控制多个线程之间访问共享资源的方式,以确保在任何时候只有一个线程能够访问某个资源。这可以通过多种方式实现,包括互斥锁(mutexes)、信号量(semaphores)、条件变量(condition ...

    条件变量交替控制多线程共享资源

    适合linux-c网络编程初学者学习的多线程控制,linux下编译通过,通过互斥锁和条件变量,最终线程的运行结果输出到txt文件中。

    线程同步方法,和线程创建方法

    线程隶属于进程,线程是属于进程内部的程序流,目前主流的操作系统都支持多进程,而... 而线程是轻量级的,新建线程会共享所在进程的内存资源等,因此线程对系统资源的消耗 比较小,当然每个线程都拥有一块独立的栈区;

    多线程编程中关键的一步是保护所有的共享资源,

    多线程编程中关键的一步是保护所有的共享资源,工具主要有互锁函数、临界段和互斥体等;另一个实质性部分是协调线程使其完成应用程序的任务,为此,可利用内核中的事件对象和信号。 在进程内或进程间实现线程同步的...

    java学习多线程处理

    线程与父进程的其他线程共享进程所有的全部资源。 独立运行,采用独占方式。 一个线程可以创建和删除另外一个线程。 同一个进程中的多个线程之间可以并发执行。 线程的调度管理是由进程来完成的。 注意:编程...

    如何用 VB.net同步对共享资源在多线程环境中访问

    如何用 Visual Basic.net 或 Visual Basic 2005 同步对共享资源在多线程环境中访问

    Python程序设计:多线程爬虫.pptx

    进程中的内存空间也是共享的,每个线程都可以使用这些共享内存。可是,有些房间最多只能容纳一个人,里面有人的时候,其他人就不能进去了。一个防止他人进入的简单方法,就是门口加一把锁。 Python多线程爬虫 Python...

    多线程操作实例源码

    线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题 线程太多会导致控制太复杂,最终可能造成很多Bug  基于以上认识,我们可以一个比喻来加深理解。假设有一个公司,公司里有很多各司其职的职员,...

    Java-如何解决多线程当中共享资源的冲突问题

    解决多线程当中共享资源冲突的问题 1. 冲突问题展示: /* * 共享资源冲突的问题 */ class SingleThread implements Runnable { // 共享资源,100张票 private static int ticket = 100; @Override public void ...

    多线程操作实例源码,,

    线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题 线程太多会导致控制太复杂,最终可能造成很多Bug  基于以上认识,我们可以一个比喻来加深理解。假设有一个公司,公司里有很多各司其职的职员,...

Global site tag (gtag.js) - Google Analytics