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.