最近在项目中运用多线程比较多,对synchronized,wait(),notify(),做了一些实验。
1、针对方法的synchronized实际上是对该对象加锁。
package com.test.wait_notify;
/**
* 锅巴
* 描述
* @version 1.0 2010-8-10
*/
public class Main {
public static void main(String[] args) throws InterruptedException {
Main main = new Main();
(new Thread(new MyThread(main))).start();
Thread.sleep(1000);
main.test2();
}
public synchronized void test3() throws InterruptedException{
System.out.println(Thread.currentThread().getName() + " test3()");
notify();
wait();
}
public synchronized void test2(){
for(int i=0; i<10; i++){
System.out.println(Thread.currentThread().getName() + " test2()");
}
}
public synchronized void test1() throws InterruptedException{
System.out.println(Thread.currentThread().getName() + " test1() start");
//wait();
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName() + " test1() end");
}
}
class MyThread implements Runnable{
private Main main;
public MyThread(Main main){
this.main = main;
}
public void run() {
// TODO Auto-generated method stub
try {
main.test1();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果
Thread-0 test1() start
Thread-0 test1() end
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
MyThread.run中调用synchronized void test1() ,这时对main对象加锁
main.test2()要等待main锁释放。
结论:当某线程调用某synchronized 修饰的方法时,会对该对象加锁。其他对象在调用其他synchronized 修饰方法时要等该获得该对象锁。
2、wait(),notify(),notifyAll() 必须在 synchronized 修饰内才有用。
3、wait()是让线程等待,放弃执行权力,并释放锁。
/**
* 锅巴
* 描述
*
* @version 1.0 2010-8-10
*/
public class Main {
public static void main(String[] args) throws InterruptedException {
Main main = new Main();
(new Thread(new MyThread(main))).start();
(new Thread(new MyThread(main))).start();
(new Thread(new MyThread(main))).start();
Thread.sleep(1000);
main.test2();
Thread.sleep(1000);
main.test3();
main.test3();
main.test3();
}
public synchronized void test3() throws InterruptedException{
System.out.println(Thread.currentThread().getName() + " test3()");
notify();
}
public synchronized void test2(){
for(int i=0; i<10; i++){
System.out.println(Thread.currentThread().getName() + " test2()");
}
}
public synchronized void test1() throws InterruptedException{
System.out.println(Thread.currentThread().getName() + " test1() start");
wait();
System.out.println(Thread.currentThread().getName() + " test1() end");
}
}
class MyThread implements Runnable{
private Main main;
public MyThread(Main main){
this.main = main;
}
public void run() {
// TODO Auto-generated method stub
try {
main.test1();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
执行结果
Thread-0 test1() start
Thread-2 test1() start
Thread-1 test1() start
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test3()
main test3()
main test3()
Thread-0 test1() end
Thread-1 test1() end
Thread-2 test1() end
在各线程调用main.test1()时碰到wait(),休眠并释放锁,其他线程可以进入。
main.test2()在各线程都wait()时调用