首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

java-thread 基础小结

2012-11-22 
java-thread 基础总结1.sleep()方法  使当前线程进入阻塞状态,在指定时间内让当前正在执行的线程暂停执行,

java-thread 基础总结

1.sleep()方法

  使当前线程进入阻塞状态,在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。不推荐使用。

2.wait()方法

  导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。

3.yield方法

  暂停当前正在执行的线程对象。当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。

  yield()只能使同优先级或更高优先级的线程有执行的机会。

4.join方法

  等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测。

5.notifyAll

? ? ? ? 唤醒在此对象监视器上等待的所有线程。线程通过调用其中一个 wait 方法,在对象的监视器上等待。?

? ? ? ? 直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。

?

?

6种状态:

? ? ? ? 1、new----调用start()--->2、runnable<--------cpu轮流调度-------->3、running------run方法执行完毕----->4、dead

? ? ? ? 3、running------执行一个线程的synchronized,其他线程进入lock pool,等待获得lock----->2、runnable

? ? ? ? 3、running------wait,进入wait pool,----->5、wait状态------notifyAll--->进入lock pool

? ? ? ? 3、running------block event,进入blocked(阻塞)pool,unblock event----->2、runnable

? ? ? ? 6、blocked 阻塞状态。

?

线程通信,

?

进程:

? ? ? ? 操作系统分配资源:内存,文件句柄,安全证书。、

? ? ? ? 进程原始的通信机制:socket、信号处理程序(signal handlers)、共享内存(shared memory)、信号量(semaphores)、文件

?

? ? ? ? 1、资源利用,有时候程序需要等待I/O,就释放占用的CPU,让其他程序使用。

? ? ? ? 2、机会公平

? ? ? ? 3、方便编程,???

?

线程2大问题:1线程之间不可见、2线程之间无序。要使得可见+有序(原子),volatile使得可见,单不是原子,可以作为状态控制使用。

?

顺序编程:

? ? ? ? 每一条指令的执行,都有对下一条指令的明确定义,线程不是顺序执行,会重排序recordering,可以通过synchronized 保证顺序

线程:

? ? ? ? 共享进程范围内的资源:比如内存,文件句柄,他们访问相同的变量,从同一堆中分配对象(所以通信更容易)

现代的OS,都是以线程作为基本调度单元。

?

线程的有点:

? ? ? ? 1、使用多CPU

? ? ? ? 2、模型的简化

? ? ? ? 3、对异步事件的简单处理

? ? ? ? 4、用户界面的更加响应性

?

线程的风险:

? ? ? ? 1、安全风险:结果不正常,安全意味着:“什么坏事都没有发生”

? ? ? ? 2、 liveness(活性,活跃度)风险:liveness意味着:“好事(期望的事)最终肯定会被执行”,

? ? ? ? ? ? ? ? liveness失败,进程中也有如:if(true){}else{liveness failure}

? ? ? ? ? ? ? ? 线程增加了发生的几率如:死锁,饥饿,活锁。

? ? ? ? 3、性能风险:期望的事情尽快的被执行。如:响应速度、吞吐量、可伸缩性。线程会带来context switch的开销。

? ? ? ? ? ? ? ? 考虑分离锁(把一个锁拆分成多个)

?

?

?

2.1线程安全管理:(被多线程访问时,仍然可以正确执行,)

? ? ? ? ? ? ? ? 管理一个“对象”的“共享、可变”的状态(即数据),存储在状态变量(域)中,比如:实例变量,静态变量

? ? ? ? ? ? ? ? 保护数据:取决于程序如何使用对象(也是数据),而不是对象完成了什么。

? ? ? ? 三种途径:

? ? ? ? ? ? ? ? 1、不夸线程使用共享状态变量:独享地操作本地(基于栈的)变量。

? ? ? ? ? ? ? ? 2、使状态变量不可变

? ? ? ? ? ? ? ? 3、使用同步。

?

? ? ? ? 设计线程安全的类:封装、不可变行、不可变约束。

?

3.1原子性:(相对于复合操作)

? ? ? ? race condition:竞争条件(竞争,争夺共享资源的情况,has several race conditions )

? ? ? ? ? ? ? ? 使用潜在的过期值,决定下一步的操作,,称为check-then-act,(read-wirte)这不是原子操作。不可靠。

?

锁:synchronized提供“独占锁”,保证原子性

? ? ? ? ,volatile,threadLoacl呢?什么锁?

? ? ? ? 重进入:线程试图获得它自己占有的锁时,请求会成功,请求基于per-thread,而不是per-invocation

? ? ? ? public calss A{

? ? ? ? ? ? ? ? public synchronized void doSomething(){...}

? ? ? ? }

? ? ? ? public calss B extends A{

? ? ? ? ? ? ? ? public synchronized void doSomething(){super.doSomethiong();...}

? ? ? ? }

? ? ? ? 如果不可以重进入,B对象调用doSomething时将会死锁

?

?

chapter3 共享对象

? ? ? ? 3.1Visibility(应该翻译成,可预见性,执行顺序的可预见)?就是可见性,以前理解错误。线程A可以始终看见其他线程的对数据执行的结果。

? ? ? ? ? ? ? ? 一个线程,和一个主线程即可。

? ? ? ? ? ? ? ? 线程不是顺序执行(NoVisibility),会重排序recordering,可以通过synchronized 保证顺序。

? ? ? ? ? ? ? ? synchronized 可以保证可预见性和原子性。

? ? ? ? ? ? ? ? volatile变量

? ? ? ? ? ? ? ? ? ? ? ? 1、当多个线程使用同一个变量时,每个线程都在其java stack缓冲中有一个这个变量的拷贝,对这个变量的改变实际上是对这个复制品进行改变。而另一个线程在使用这个变量时还可能一无所知。

? ? ? ? ? ? ? ? ? ? ? ? 2、volatile变量,不会去假设这个变量的值,每次都重新读取这个变量的值,对变量进行改变时直接作用于主内存。

? ? ? ? ? ? ? ? volatile只能保证可见性,不能保证“读-改-写”的原子性,不能使i++原子化。

? ? ? ? ? ? ? ? volatile变量不会被jvm缓存。一般用来做完成、中断的标记。需满足以下条件。线程A的i++,可能被线程B的i++干扰。

? ? ? ? ? ? ? ? ? ? ? ? 1、写入变量时不依赖变量的当前值,或者确保只有一个线程操作,i++就依赖当前值,它不需要操作堆内存。

? ? ? ? ? ? ? ? ? ? ? ? 2、The variable does not participate in invariants with other state variables; ????????

? ? ? ? ? ? ? ? ? ? ? ? 3、Locking is not required for any other reason while the variable is being accessed.??????????

? ? ? ? ? ? ? ? volatile变量的几个例子(C语言上的):   

? ? ? ? ? ? ? ? ? ? ? ? 1). 并行设备的硬件寄存器(如:状态寄存器)   

? ? ? ? ? ? ? ? ? ? ? ? 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)   

? ? ? ? ? ? ? ? ? ? ? ? 3). 多线程应用中被几个任务共享的变量?

? ? ? ? ? ? ? ? ? ? ? ? 区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用不懂得volatile内容将会带来灾难。?

?

?

? ? ? ? 3.2. Publication and Escape(发布和逸出)

? ? ? ? ? ? ? ? Publishing an object means making it available to code outside of its current scope, such as :

? ? ? ? ? ? ? ? ? ? ? ? 1、by storing a reference to it where other code can find it,?

? ? ? ? ? ? ? ? ? ? ? ? 2、returning it from a nonprivate method, or passing it to a method in another class.?

?

? ? ? ? ? ? ? ? escaped: ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? publishing objects before they are fully constructed can compromise thread safety

?

?

线程组是一个可以统一管理的线程集合,默认创建的线程,都属于相同的线程组。

竞争条件:

? ? ? ? accounts[0] += amount;//不是原子操作

? ? ? ? 1、将accounts[0]加载到寄存器(java没有寄存器吧?叫pc,只是个名字不同而已)

? ? ? ? 2、增加amount

? ? ? ? 3、将结果写回accounts[0]

? ? ? ? //aload_0,getfield,iload_2,dup2,执行它们的线程可以在任何一个指令点上被中断。

? ? ? ? C语言-计算机原理

? ? ? ? 装载-写入内存--?

?

java的每个对象有一个内部锁和内部条件。 ? ? ? ?

?

线程的优势:执行异步或后台处理、简化建模、使 UI 响应更快、利用多处理器系统 ?

线程由谁控制,java还是操作系统,程序员无法控制线程的结束?

一个进程中的多个线程共享相同的内存地址空间,意味着可以访问共同的变量和对象。

每个线程有自己的堆栈、程序计数器、局部变量。

每个 Java 程序都至少有一个线程 — 主线程。当一个 Java 程序启动时,JVM 会创建主线程,并在该线程中调用程序的 main() 方法。 ?

? ? ? ? JVM 还创建了其它线程,您通常都看不到它们 — 例如,与垃圾收集、对象终止和其它 JVM 内务处

? ? ? ? 理任务相关的线程。 其它工具也创建线程,如 AWT (抽象窗口工具箱 (Abstract ?Windowing ?Toolkit))

? ? ? ? 或 Swing UI 工具箱、servlet 容器、应用程序服务器和 RMI(远程方法调用(Remote Method Invocation))

?

热点排行