w1100n
This site is best viewed in Google Chrome
wiloon, 1/13/2015 5:52 | Tag:

thread join 之后,主线程的状态是waiting 一、在研究join的用法之前,先明确两件事情。 1.join方法定义在Thread类中,则调用者必须是一个线程, 例如: Thread t = new CustomThread();//这里一般是自定义的线程类 t.start();//线程起动 t.join();//此处会抛出InterruptedException异常 2.上面的两行代码也是在一个线程里面执行的。 以上出现了两个线程,一个是我们自定义的线程类,我们实现了run方法,做一些我们需要的工作;另外一个线程,生成我们自定义线程类的对象,然后执行 customThread.start(); customThread.join(); 在这种情况下,两个线程的关系是一个线程由另外一个线程生成并起动,所以我们暂且认为第一个线程叫做“子线程”,另外一个线程叫做“主线程”。 二、为什么要用join()方法 主线程生成并起动了子线程,而子线程里要进行大量的耗时的运算(这里可以借鉴下线程的作用),当主线程处理完其他的事务后,需要用到子线程的处理结果,这个时候就要用到join();方法了。 三、join方法的作用 在网上看到有人说“将两个线程合并”。这样解释我觉得理解起来还更麻烦。不如就借鉴下API里的说法: “等待该线程终止。” 解释一下,是主线程(我在“一”里已经命名过了)等待子线程的终止。也就是在子线程调用了join()方法后面的代码,只有等到子线程结束了才能执行。(Waits for this thread to die.) 四、用实例来理解 写一个简单的例子来看一下join()的用法,一共三个类: 1.CustomThread 类 CustomThread1类 JoinTestDemo 类,main方法所在的类。 代码1: view plain copy … Continue reading

wiloon, 12/5/2014 1:20 | Tag:

计算机的工作方式是基于冯诺依曼结构的,从磁盘读取数据到内存,再从内存读取数据到cpu内部的三级,二级,一级最后到达寄存器。java中的多线程的主内存就是内存上面的jvm堆,程序在运行时的线程所要的数据都是来自内存,读取并最终传入cpu内部寄存器,每个cpu内部都有各自的一套完整寄存器,cpu只能直接操作这些存储,比如cpu的加法指令吧两个寄存器里面的数据加起来放入其中一个或者地三个寄存器,计算的结果如需要保存,cpu需要另一个指令吧数据传输到数据总线并保存到内存,最终写回磁盘。在这个过程中,内存数据可能被多个线程同时读取,并在cpu内部形成私有的拷贝,就是本地内存(内存的cpu内部本地副本)在线程中体现在线程栈区,正是这种分步多指令实现一个操作,在多线程被调度置换过程中数据被多个线程操作,造成数据竞争,所以数据经常用到锁等手段实现同步。 上面从硬件的实现角度看,从软件的角度看,线程可访问的数据就分共享数据,和私有数据,这个在不同的计算机编程语言中体现都不一样,比如java中的类属性就可以是共享的也可以是私有的,当这个类的实例是在方法内部创建的,那属性就是线程私有的,因为整个对象都是线程私有的,如果该对象被传到线程中的方法,该对象就是共享的。这个界限就看数据是在哪里产生和多线程可访问性;线程防范内部产生并不被方法外部可访问的数据都是私有数据,多线程编程称为线程安全。相反线程不安全。 Java 虚拟机规范定义了 Java 内存模型来屏蔽掉各种硬件和操作系统的内存差异,达到跨平台的内存访问效果。 为了获得更好的执行性能,Java 内存模型没有限制执行引擎使用处理器的特定缓存器或缓存来和主内存(可以和 RAM类比,但是是虚拟机内存的一部分)交互,工作内存(可类比高速缓存,也是虚拟机内存的一部分)为线程私有。 工作内存和主内存的划分和 Java 堆,栈,方法区的划分不同,两者基本没有关系,如果勉强对应,则主内存可理 解为堆中实例数据部分,工作内存则对应栈中部分区域 —–引用<<深入理解 JAVA 虚拟机>> 2016年04月07日回答 评论 编辑 wlingxiao 124 声望 答案对人有帮助,有参考价值0 答案没帮助,是错误的答案,答非所问 一个线程会有一个线程栈,一个方法调用就是一个栈帧。一个栈帧又分为:局部变量区、操作数栈和帧数据区。你可以理解 工作内存为局部变量区中的数据。 https://segmentfault.com/q/1010000004885908 https://www.oschina.net/question/1779843_2163094

wiloon, 12/5/2014 1:05 | Tag:

自旋锁 自旋锁/Spin lock 排队自旋锁 排队自旋锁/Ticket Lock MCS锁 MCS锁/MCS Spinlock CLH锁 CLH 差异: 从代码实现来看,CLH比MCS要简单得多。 从自旋的条件来看,CLH是在前驱节点的属性上自旋,而MCS是在本地属性变量上自旋。 从链表队列来看,CLH的队列是隐式的,CLHNode并不实际持有下一个节点;MCS的队列是物理存在的。 CLH锁释放时只需要改变自己的属性,MCS锁释放则需要改变后继节点的属性。 注意:这里实现的锁都是独占的,且不能重入的。 自旋锁、排队自旋锁、MCS锁、CLH锁

辽ICP备14012896