深入浅出Java多线程笔记

深入浅出Java多线程笔记:

首先感谢幕课网<<深入浅出java多线程>>老师的详细讲解。

特作以下笔记:

  • Volatile 保证变量的原子性,一个变量被此修饰则表明是对所有线程可见的,满足一致性 即各个线程的工作内存能立即发现该变量的改变并保证一致性。另外根据JMM(java Memory Model), change-before 原则, 对一个volatile变量的写操作先行发生于后面对这个变量的读取操作。volatile变量写先于读。

  • JMM(java memory model)java内存模型规定java中所有的变量(指静态变量,常量等线程共享的变量,不包括局部变量等私有的变量)均存放于主内存中,每个线程则有各自的工作内存,工作内存中的变量是主内存的副本,线程只能对工作内存中的变量进行直接操作,并且线程之间是不能互相访问对方的工作内存的,只能依靠主内存进行通信。

  • Java内存模型中定义的两项操作之间的次序关系,如果说操作A先行发生于操作B,操作A产生的影响能被操作B观察到,“影响”包含了修改了内存中共享变量的值、发送了消息、调用了方法等。

public void join() - 等待这个线程死亡
public void interrupt() - 中断这个线程。

如果该线程阻塞的调用wait() , wait(long) ,或wait(long, int)的方法Object类,或者在join() ,
join(long) , join(long, int) , sleep(long) ,或sleep(long, int)
,这个类的方法,那么它的中断状态将被清除,并且将收到一个InterruptedException 。

如果该线程在可阻止在I /
O操作InterruptibleChannel则信道将被关闭,该线程的中断状态将被设置,并且螺纹将收到一个ClosedByInterruptException

如果该线程在Selector中被阻塞,则线程的中断状态将被设置,并且它将从选择操作立即返回,可能具有非零值,就像调用了选择器的wakeup方法一样。

如果以前的条件都不成立,则该线程的中断状态将被设置。

扫描二维码关注公众号,回复: 8694185 查看本文章

中断不存在的线程不需要任何效果。

所以Interrupt() 只是设置Thread处于中断状态,并不能立即中断程序,并且以上例外并不能设立中断状态。

另外stop() 方法已经被摒弃了,因为该方法会立即把线程中断, 不管处于何种运行状态,如果有database transaction 等后台业务操作等事物会产生不良后果,这种方法本质上是不安全的。所以不应使用这个中止线程的方法。而应该使用有条件的推出。

public static void yield() - 让出处理器时间.

对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器。 调度程序可以自由地忽略这个提示。
产量是一种启发式尝试,以改善否则会过度利用CPU的线程之间的相对进度。 其使用应与详细的分析和基准相结合,以确保其具有预期的效果。

很少使用这种方法。 它可能对调试或测试有用,可能有助于根据种族条件重现错误。
在设计并发控制结构(例如java.util.concurrent.locks包中的并行控制结构)时也可能有用。

Thread 构造函数:

Thread() 分配一个新的 Thread对象。
Thread(Runnable target) 分配一个新的 Thread对象。
Thread(Runnable target, String name) 分配一个新的 Thread对象。

从上面的API来看, 线程的定义有两种,一种是直接用Thread类, 另一种是implements Runnable Interface, 再用Thread(Runnable target) or Thread(Runnable target, String name) 来生成新的线程。

发布了14 篇原创文章 · 获赞 0 · 访问量 291

猜你喜欢

转载自blog.csdn.net/weixin_43237071/article/details/103554258