synchronized 关键字
它包括两种用法:synchronized 方法和 synchronized 块。
synchoronized产生的锁是对象的锁,对于两个对象,他们之间是不同步的。
package hehe;
public class ExampleThread extends Thread {
private String threadName;
public ExampleThread(String name){
this.threadName=name;
}
public void run() {
// TODO Auto-generated method stub
System.out.println(this.threadName);
fun1();
fun2();
}
public synchronized void fun1(){
System.out.println("fun1");
try {
this.sleep(10000000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public synchronized void fun2(){
System.out.println("fun2");
}
private String threadName;
public ExampleThread(String name){
this.threadName=name;
}
public void run() {
// TODO Auto-generated method stub
System.out.println(this.threadName);
fun1();
fun2();
}
public synchronized void fun1(){
System.out.println("fun1");
try {
this.sleep(10000000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public synchronized void fun2(){
System.out.println("fun2");
}
}
///
package hehe;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ExampleThread thread1=new ExampleThread("thread1");
ExampleThread thread2=new ExampleThread("thread2");
thread1.start();
thread1.run();
//thread2.start();
}
}
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ExampleThread thread1=new ExampleThread("thread1");
ExampleThread thread2=new ExampleThread("thread2");
thread1.start();
thread1.run();
//thread2.start();
}
}
The Result is//
thread1
thread1
fun1
thread1
fun1
因为thread1对象在fun1()中sleep了,所以占用了这个锁,所以第二次调用run()时,进入不了fun1()函数。