1. synchronized 方法和 synchronized 块
synchronized 方法
1) 所声明为 synchronized 的成员函数中至多只有一个处于可执行状态
2) 一个大的方法声明为synchronized 将会大大影响效率,比如run()
synchronized 块(推荐)
synchronized(syncObject) {
//允许访问控制的代码
}
1) thread1访问object的一个synchronized(this)同步代码块时,它就获得了object.lock
2) thread2堵塞任何synchronized(this)的同步代码块
3) thread2正常运行于非synchronized(this)非同步代码块。
---------------------------------
遗留:
1) 如果instance变量是一个对象,如数组或ArrayList什么的,那上述方法仍然不安全,因为当外界对象通过get方法拿到这个instance对象的引用后,又将其指向另一个对象,那么这个private变量也就变了,岂不是很危险。 这个时候就需要将get方法也加上synchronized同步,并且,只返回这个private对象的clone()――这样,调用端得到的就是对象副本的引用了。
---------------------------------
2. 多线程的Start和Run方法
1) thread1 = new Thread();仅仅是创建了Thread,从scr中可以看出调用init方法。
2) thread1.start()是调用启动,执行run方法,如果不重写run方法,则run()默认为空。
3) 每个线程都将启动,每个线程都将运行直到完成。一系列线程以某种顺序启动并不意味着将按该顺序执行。对于任何一组启动的线程来说,调度程序不能保证其执行次序,持续时间也无法保证。
--------------------------------
3. 阻塞:
1) wait & notify方法
1. 当在对象上调用wait()方法时,执行该代码的线程立即放弃它在对象上的锁。然而调用notify()或notifyAll()时,并不意味着这时线程会放弃其锁。如果线程仍然在完成同步代码,则线程在移出之前不会放弃锁。因此,只要调用notify()并不意味着这时该锁变得可用。
2. 当线程调用stop方法,即可使线程进入消亡状态,但是由于stop方法已被废弃不建议使用。
2) sleep() 方法:
sleep() 允许 指定以毫秒为单位的一段时间作为参数,时间一过,线程重新由阻塞状态进入可执行状态。
3) suspend() 和 resume() 方法:两个方法配套使用,典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。
4) yield() 方法:yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程。
------------------------------
4. Thread & Runnable创建线程
Runnable是接口,需要实现Run方法。现实中多用Runnable接口方法。
Thread是类继承,但Java是单继承,如果一个类已经继承了其他类,则无法再继承thread,一般通过实现runnable接口。
两种方法示例Thread Test = new Thread();
Test.start();
在使用Runnable的时候需要先new一个实现Runnable的实例,之后启动Thread即可。
Test impelements Runnable;
Test t = new Test();
Thread test = new Thread(t);
test.start();