精华内容
下载资源
问答
  • JVM运行时区域各线程共享的区域包括堆区和方法区。堆区堆区最最主要的功能是存储对象实例【上篇也提到过】,因此Java垃圾回收的主要战场就是在堆区,因此也有称为GC堆区。如果堆区的内存不够会出现OutOfMemory异常。...

    JVM运行时区域各线程共享的区域包括堆区和方法区。

    堆区

    堆区最最主要的功能是存储对象实例【上篇也提到过】,因此Java垃圾回收的主要战场就是在堆区,因此也有称为GC堆区。如果堆区的内存不够会出现OutOfMemory异常。

    为了方便回收,堆区可以细分为新生代和老年代。顾名思义,新生代里都是新创建的或者年龄不大的对象,新生代区又有三个区域,eden区,s0区和s1区。绝大多数情况新生对象都是在eden区,当一次回收之后如果对象还存在,就会进入s0或者s1区,之后每次回收如果都能存在,那么年纪就加一,达到一定年龄后就会进入老年代区。

    老年代区存储的都是经过很多次回收仍然存在的,也有一些大的对象会直接进入老年代【比如长字符串和长数组】,表示这里对象存活率高,声明周期长。老年代和新生代区域的差别在于新生代GC次数更加频繁。

    方法区

    在不同的JDK版本和不同的JVM实现方式中,方法区的实现方法多经变更,甚至互相矛盾,例如永久代和元空间,因此很难详细的总结方法区的具体工作方式。因此,了解方法区的主要存储对象是更为重要的,包括:

    1、类型信息:

    类的完整名称

    类的直接父类的完整名称

    类的直接实现接口的有序列表

    类型标志(类类型还是接口类型)

    类的修饰符(public private defautl abstract final static)

    2、类型的常量池

    存放该类型所用到的常量的有序集合,包括直接常量(字符串、整数、浮点数)和对其他类型、字段、方法的符号引用。

    3、字段信息(该类声明的所有字段)

    字段修饰符(public、peotect、private、default)

    字段的类型

    字段名称

    4、方法信息

    方法信息中包含类的所有方法。

    方法修饰符

    方法返回类型

    方法名

    方法参数个数、类型、顺序等

    方法字节码

    操作数栈和该方法在栈帧中的局部变量区大小

    异常表

    5、类变量(静态变量)

    6、指向类加载器的引用

    7、指向Class实例的引用

    8、方法表

    9、运行时常量池(Runtime Constant Pool)

    方法区存储内容转载自这里

    总结:堆区用于存储实例对象,GC过程在此发生;方法区存储很多东西,重要的包括常量池、静态变量以及一些类和方法信息;栈区存储方法的参数和局部变量,还有基本数据类型和引用类型的引用。

    展开全文
  • 线程仅仅被视为一个与其他进程共享某些资源的进程,而 是否共享地址空间几乎是进程和 Linux 中所谓线程的唯一区别 。线程创建的时候,加上了 CLONE_VM 标记,这样 线程的内存描述符 将直接指向 父进程的内存描述符 ...

    Linux系统把所有线程都当做进程来实现,线程作为轻量级进程(LWP)。

    线程仅仅被视为一个与其他进程共享某些资源的进程,而
    是否共享地址空间几乎是进程和 Linux 中所谓线程的唯一区别
    。线程创建的时候,加上了 CLONE_VM 标记,这样
    线程的内存描述符 将直接指向 父进程的内存描述符
    ,也就是说,
    线程的mm_struct *mm指针变量和所属进程的mm指针变量相同。
    所有线程都共享一份地址空间
    ,这不但包括text、heap和进程stack等,
    甚至还包括了线程stack。

    注意此处表达的字面意思:
    所有线程共享包括线程栈在内的地址空间,并不意味着所有线程都共享一个栈地址,而是一个线程可以访问另一个线程的栈数据
    (虽然并没什么用,但确实可行,通过实验可以验证)。显然,
    不同线程有不同的函数调用关系所以不能使用同一个栈
    。之所以能做到线程A能访问线程B的栈数据,正是因为内核为每个线程在不同地址处分配了栈空间,从进程的全局地址空间看(cat /proc/PID/maps),每个线程的stack都位于不同的地址段。

    虽然线程共享地址空间,但线程的私有数据,又是需要单独保存的,这包括了:
    pthread属性相关,pthread_attr
    线程栈,thread stack
    线程本地存储,TLS(thread local storage)

    这三种数据位于同一块内存中,是在创建线程的时候,用mmap系统调用从heap分配出来的

    展开全文
  • 您认为理所当然的方法是共享内存:除了具有令人信服的理由是线程特定的数据(如堆栈)之外,所有数据都可以被所有线程访问。基本上有一个共享堆。这给你的速度:任何时候一个线程改变一些数据,其他线程可以看到它。 ...

    当你想将数据从一个线程传递给另一个线程时,你会做什么? (如果你没有这样做,你将会编写单独的程序,而不是一个多线程程序。)有两种主要方法:

    >您认为理所当然的方法是共享内存:除了具有令人信服的理由是线程特定的数据(如堆栈)之外,所有数据都可以被所有线程访问。基本上有一个共享堆。这给你的速度:任何时候一个线程改变一些数据,其他线程可以看到它。 (限制:如果线程正在不同的处理器上执行,这是不正确的:程序员需要非常努力地正确有效地使用共享内存)。大多数主要的命令式语言(尤其是Java和C#)都倾向于使用该模型。

    每个线程可以有一个堆,加上一个共享堆。这要求程序员决定哪些数据放在哪里,而且通常不能与现有的编程语言联网。

    >双重方法是消息传递:每个线程都有自己的数据空间;当一个线程想要与另一个线程通信时,它需要向另一个线程显式地发送消息,以便将数据从发送者的堆复制到接收方的堆中。在这种情况下,许多社区喜欢调用线程进程。这给了你安全:由于线程不能覆盖其他线程的内存,所以很多错误都可以避免。另一个好处是分发:您可以使线程在不同的机器上运行,而无需更改程序中的单行。您可以为大多数语言找到消息传递库,但集成往往不那么好。理解信息传递的良好语言是Erlang和JoCaml。

    事实上,消息传递环境通常在场景后面使用共享内存,至少只要线程在相同的机器/处理器上运行。由于将消息从一个线程传递到另一个线程,因此无需制作数据副本,因此节省了大量时间和内存。但由于共享内存不会暴露给程序员,因此其固有的复杂性仅限于语言/库实现。

    展开全文
  • 本篇文章给大家带来的内容是关于Python多线程共享全局变量的实现代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。在一个进程内的所有线程共享全局变量。但多线程对全局变量的更改会导致变量...

    本篇文章给大家带来的内容是关于Python多线程共享全局变量的实现代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    在一个进程内的所有线程共享全局变量。但多线程对全局变量的更改会导致变量值得混乱。

    实例:验证同一个进程内所有线程共享全局变量

    代码:#验证同一个进程内的所有线程共享全局变量

    from threading import Thread

    import time

    g_num=1000

    def work1():

    global g_num

    g_num+=3

    print("work1----num:",g_num)

    def work2():

    global g_num

    print("work2---num:",g_num)

    if __name__ == '__main__':

    print("start---num:",g_num)

    t1=Thread(target=work1)

    t1.start()

    #故意停顿一秒,以保证线程1执行完成

    time.sleep(1)

    t2=Thread(target=work2)

    t2.start()

    结果:start---num: 1000

    work1----num: 1003

    work2---num: 1003

    相关推荐:

    python 类变量 在多线程下的共享与释放问题

    探究Python多进程编程下线程之间变量的共享问题

    展开全文
  • 进程有哪些资源? 线程包含哪些?
  • JAVA线程共享变量问题

    2021-03-05 18:08:09
    Java内存模型为什么出现这种情况呢,我们需要先了解一下JMM(java内存模型)java虚拟机...JMM决定一个线程共享变量的写入何时对另一个线程可见,JMM定义了线程和主内存之间的抽象关系:共享变量存储在主内存(Main M...
  • 究竟JVM内存区域哪些是线程共享,哪些是非线程共享呢? 多数 JVM 将内存区域划分为Method Area(Non-Heap)(方法区),Heap(堆),Program Counter Register(程序计数器),VM Stack(虚拟机栈,也有翻译成JAVA ...
  • 线程共享变量缓存不一致问题。 早期解决方案是总线加锁,性能很低。 后来是缓存一致性协议,嗅探主内存数据变化,从何使得线程的工作缓存失效,避免不一致。
  • 实验三:线程共享进程数据 一、 实验目的: 了解线程和进程之间的数据共享关系,创建一个线程,在线程中更改进程中的数据; 二、 实验内容: 在进程中定义全局共享数据,在线程中直接引用该数据进行更改并输出该...
  • } } } } 输出结果中 线程1和线程2后面的i应该是共享的并且连续的,如线程2-0、线程1-1、线程1-2、线程2-3、线程1-4、线程1-5、线程2-6... 但我跑了很多次,发现每次线程1和线程2都会输出0:线程1-0,线程2-0。但...
  • 线程独享 虚拟机栈区 本地方法栈 ...虚拟机堆区,准确说是新生代伊甸区,会分配一小部分内存空间(1%左右)给线程来解决指针碰撞的问题,这部分区域在分配的时候是线程独享的,使用的时候是线程共享的 ...
  • 1、多线程共享数据 可能带来的问题:数据不安全 原因:多线程共同操作数据时,引发的冲突(如延时操作,操作未全部完成等等 ) 2、给线程加锁,同步方法 使用synchronized修饰的方法控制对类成员变量的访问(参数...
  • 对于保证内存可见性,堆中对象明明是线程共享的,为什么还需要用volatile来修饰对象?   多线程堆共享变量的修改分为很多步骤。举个简单的例子: public class VolatileTest { private static boolean flag = true...
  • 线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。 进程拥有这许多共性的...
  • 共享的是可变类型参数,直接将该参数参数通过args传入线程中去,其中sleep函数的作用是降低运行速度,方便打印出想要的结果 import threading from time import sleep def demo1(a,num): sleep(0.5) #为a...
  • 如果一个线程共享变量值的修改,能够及时的被其他线程看到,叫做共享变量的可见性。如果一个变量同时在多个线程的工作内存中存在副本,那么这个变量就叫共享变量 2. JMM(java内存模型) 多个线程同时对主内存的...
  • python 多线程共享全局变量的优劣,线程,全局变量,多线程,数据,多个python 多线程共享全局变量的优劣易采站长站,站长之家为您整理了python 多线程共享全局变量的优劣的相关内容。一、多线程共享全局变量首先我们来...
  • 2.线程共享进程数据

    2021-05-28 10:28:31
    2.线程共享进程数据实验目的实验内容程序框架需要用到的函数线程函数CreateThreadWaitForSingleObject上代码 实验目的 学习创建线程实现多工作同步运行; 了解线程与进程之间的数据共享关系。 实验内容 在进程中...
  • 1 线程共享和非共享 1.1 线程共享资源 1)文件描述符表。由于线程间共享进程间的内容,而文件描述符表在主线程的PCB当中,各个线程可以直接去请求访问,所以线程间通信就不需要像进程那样通过管道这些方式通信。 2...
  • 线程有共同变量 initFlag,未使用volatile效果如下: 现象:线程1执行到while时,当前 initFlag = false,所以线程1进入死循环;线程2执行,调用 prepareData(),该方法中...结论是线程2变更initFlag的值,并没有共享
  • } } /** * 移除当前线程缓存 * 用于释放当前线程threadlocal资源 */ public static void remove() { cache.remove(); } private static boolean isCaheIsNull() { return cache.get() == null; } } 重点:一定要记住...
  • Java多线程资源共享

    2021-07-15 15:47:41
    Java多线程资源共享 我们在编写Java多线程并发控制程序时,经常需要我们考虑到多个线程之间资源共享问题。那么,什么是资源共享问题?在Java多线程中资源共享就是多个线程共用同一个变量或者对象。下面通过模拟学生...
  • 线程共享数据问题

    2021-12-16 00:55:23
    线程共享数据可能带来的问题:数据不安全 原因:多线程共同操作数据时引发的冲突(如 延时操作未全部完成等等); 怎样实现线程安全? 第一种方法: (同步方法) 方法加锁 使用synchronized 修饰符的方法控制类...
  • 线程间到底共享了哪些进程资源?

    千次阅读 多人点赞 2020-12-18 14:10:00
    进程和线程这两个话题是程序员绕不开的,操作系统提供的这两个抽象概念实在是太重要了。关于进程和线程有一个极其经典的问题,那就是进程和线程的区别是什么?相信很多同学对答案似懂非懂。记住了不一...
  • public class ThreadScopeMultiShareData { /** * 多线程之间的共享数据的方式 */ /* * 如果每个线程执行的代码一样,可以使用同一个runnable对象,这个共享数据就可以放在runnable中,例如卖票系统 * 如下例 */// ...
  • 父子线程数据共享的实现原理2.2.1.InheritableThreadLocal类2.2.2.如何实现数据共享2.2.3.childValue()方法3.线程池中的线程数据传递失效 1.InheritableThreadLocal的作用 在前面的博客《线程安全的代码及...
  • 简单的总结一下多线程共享数据的方式。其实,最重要的,是一个思想,一个面向对象的编程思想的建立。说两点:一、如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如...
  • 免费学习推荐:java基础教程线程安全基础1.线程安全问题2.账户取款案例3.同步代码块synchronizedsynchronized的理解java中有三大变量的线程安全问题在实例方法上使用synchronized总结面试题4.死锁5.开发中应该怎么...
  • 一个进程的不同线程间内存是共享的,来看这样一段代码: 可以看到,我创建两个线程,分别执行func1,func2,它们都不断地打印data的值,并不断的加1,如果内存不共享,他们的data值应该是独立的,而我们来看看结果 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 712,523
精华内容 285,009
关键字:

线程共享