多线程学习笔记

1.局部变量永远不会被多个线程共同访问。因为:If two threads happen to execute the same method, each thread

  gets a separate copy of the local variables of that method.

2.成员变量可能被多个线程共同访问,但是Java threads cannot arbitrarily access each other’s data objects:

  they need permission to access the objects, and one thread needs to pass the object reference to the

  other thread.

3.用设置flag的方法来终止线程

volatile boolean shouldRun;

public vod run(){

if(shouldRun){

doIt();

}

4.volatile的用法

volatile —- 字面意思是易挥发的。

实际的意义,简单来说,用volatile确定义的一个变量与普通变量不同之处在于,在多线程的环境下,每个独立的线程都有自己的一块内存空间,为了提高速度,JAVA的线程会把共有的变量映射到自己的内存空间(共有的变量就是可以为多个线程访问的变量),产生一个copy。

    比如,一个线程改变了共有变量,其实它仅仅改变了那个自己的copy。共有变量其实没有真正的改变。所以,其它的线程并没有觉察到共有变量的改变,JVM会在某个不确定的时候,才会去更改共有变量的实体。

    如果,你用volatile 声明这个共有变量,它就会强制改变它的线程直接去改变它的实体,并且强制读取的线程直接读取实体的值,而每个线程不会产生这个变量的拷贝。

主要用途:

    用来声明多线程环境下的状态敏感的变量。

 

5.thread.isAlive()方法用来判断线程是否仍在运行

6.典型的stop方法

public void stop() {

t.shouldRun = false;

try {

t.join();

} catch (InterruptedException e) {}

}

7.void join()

Waits for the completion of the specified thread. By definition, join() returns as soon as the

thread is considered "not alive."

8.when a thread is stopped, the state of the thread object is set so that it is not restartable。永远不要妄想重启线程

9.互斥锁是基于对象的,而不是基于方法的。也就是说,假设o.a()和o.b()都是同步的方法,当线程甲执行o.a()方法时,线程乙不但不能执行o.a()方法,甚至连o.b()方法都没有权限执行

10.不要为run()方法加上synchronized方法。Synchronizing the run() method creates a scope that is too large and prevents other methods from being run at all.

11.凡是要被共享的数据,对它们的存取都放到synchronized方法或者synchronized块中

12.也可以不用JAVA的synchronized机制,而让我们自己编码来处理同步问题。o’relly 的java threads 介绍了一个BusyFlag类,这个类可以实现我们的目标

13.类锁(在静态方法上应用synchronized)的机制与对象锁类似。不过类锁与对象锁同时出现时,有些情况要注意:

a.如果一个同步的非静态方法调用了一个同步的静态方法, 那么这个非静态方法同时掌握到了两把锁

b….

14.notify和wait是一种同步机制,但更多地是一种线程间通信机制。一个线程利用它来通知另一个线程:某个条件已经发生了

15.wait和notify都只能用在synchronzied函数/块里

16.static methods cannot call the wait() and notify() methods directly.

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.