Java 并发编程学习知识点小记

happens-before规则

《JSR-133:Java Memory Model and Thread Specification》定义了如下happens-before规则。

  1. 程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。
  2. 监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。
  3. volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。
  4. 传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。
  5. start()规则:如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。
  6. join()规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。

------------------------------------------------------------------------------------------------------------------------------------------

Java线程间各状态的切换

注意 Java将操作系中的运行和就两个状合并称运行状。阻塞状线程阻塞在synchronized字修的方法或代码块的状,但是阻塞在java.concurrent包中Lock接口的线程状却是等待状,因java.concurrent包中Lock接口于阻塞的实现均使用了LockSupport中的相关方法。

------------------------------------------------------------------------------------------------------------------------------------------

Daemon线程

Daemon线程是一种支持型线程,因它主要被用作程序中后台度以及支持性工作。意味着,当一个Java机中不存在非Daemon线程的候,Java机将会退出。可以通过调Thread.setDaemon(true)线Daemon线程。
注意Daemon属性需要在启动线程之前置,不能在启动线程之后置。
Daemon线程被用作完成支持性工作,但是在Java机退出Daemon线程中的finally并不一定会行,示例如代所示。

运行Daemon程序,可以看到在端或者命令提示符上没有任何出。main线程(非Daemon线程)在启线DaemonRunner之后随着main方法行完止,而此Java机中已没有非Daemon线程,虚机需要退出。Java机中的所有Daemon线程都需要立即止,因此DaemonRunner立即止,但是DaemonRunner中的finally并没有行。
注意在构建Daemon线,不能依靠finally中的内容来确保行关或清理源的逻辑 

------------------------------------------------------------------------------------------------------------------------------------------
 

wait()notify()以及notifyAll()

wait()notify()以及notifyAll()需要注意的细节,如下。

  1. 使用wait()notify()notifyAll()需要先对调象加
  2. wait()方法后,线程状RUNNING变为WAITING,并将当前线程放置到象的等待列。
  3. notify()notifyAll()方法用后,等待线程依旧不会从wait()返回,需要notify()notifAll()线之后,等待线程才有机会从wait()返回。
  4. notify()方法将等待列中的一个等待线程从等待列中移到同步列中,而notifyAll()方法是将等待列中所有的线程全部移到同步列,被移线程状WAITING变为BLOCKED
  5. wait()方法返回的前提是得了象的

从上述细节中可以看到,等待/通知机制依托于同步机制,其目的就是确保等待线程从wait()方法返回感知到通知线对变量做出的修改。

中,WaitThread首先取了象的,然后象的wait()方法,从而放弃了入了象的等待WaitQueue中,入等待状。由于WaitThread放了象的NotifyThread随后取了象的,并象的notify()方法,将WaitThreadWaitQueue移到SynchronizedQueue中,此WaitThread的状态变为阻塞状NotifyThread放了之后,WaitThread再次取到并从wait()方法返回继续执行。 

------------------------------------------------------------------------------------------------------------------------------------------

中断与synchronized

事实上线程的中断操作对于正在等待获取的锁对象的synchronized方法或者代码块并不起作用,也就是对于synchronized来说,如果一个线程在等待锁,那么结果只有两种,要么它获得这把锁继续执行,要么它就保存等待,即使调用中断线程的方法,也不会生效。

等待唤醒机制与synchronized

所谓等待唤醒机制本篇主要指的是notify/notifyAll和wait方法,在使用这3个方法时,必须处于synchronized代码块或者synchronized方法中,否则就会抛出IllegalMonitorStateException异常,这是因为调用这几个方法前必须拿到当前对象的监视器monitor对象,也就是说notify/notifyAll和wait方法依赖于monitor对象,在前面的分析中,我们知道monitor 存在于对象头的Mark Word 中(存储monitor引用指针),而synchronized关键字可以获取 monitor ,这也就是为什么notify/notifyAll和wait方法必须在synchronized代码块或者synchronized方法调用的原因。

转载于:https://my.oschina.net/u/3687664/blog/2054892

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值