1、synchronized为互斥。该关键词可以申明方法也可以申明代码库。
import java.util.concurrent.TimeUnit;
public class SynchronizedDemo1 {
public synchronized static void synchronizedDemo(){
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("test1");
}
public static void test1(){
Thread thread = new Thread(){
public void run() {
synchronizedDemo();
}
};
thread.start();
}
public static void test2(){
Thread thread = new Thread(){
public void run() {
synchronizedDemo();
}
};
thread.start();
}
public static void main(String[] args) {
SynchronizedDemo1 sd = new SynchronizedDemo1();
sd.test1();
SynchronizedDemo1 sd1 = new SynchronizedDemo1();
sd1.test2();
}
}
该类中main为一个线程,分别调用同一个方法。结果得到的互斥的效果,必须要等待前一个方法执行完毕,才能执行后面的调用。经过测试,只要是不同的线程,都会起到互斥的效果
2、下面再看一个例子没有static来修饰的,这里同一对象多个线程都能启动互斥的效果,如果是不同的对象就不能起到互斥的效果。
import java.util.concurrent.TimeUnit;
public class SynchronizedDemo2 {
public synchronized void synchronizedDemo(){
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("test1");
}
public void test1(){
Thread thread = new Thread(){
public void run() {
synchronizedDemo();
}
};
thread.start();
}
public void test2(){
Thread thread = new Thread(){
public void run() {
synchronizedDemo();
}
};
thread.start();
}
public static void main(String[] args) {
SynchronizedDemo2 sd = new SynchronizedDemo2();
sd.test1();
SynchronizedDemo2 sd1 = new SynchronizedDemo2();
sd1.test2();
}
}
3、将synchronized修饰在i代码块中。这里的效果和前面类似,只是将synchronized放在代码块中更加灵活。
public class SynchronizedDemo3 {
public void synchronizedDemo(){
System.out.println("进入方法:1");
synchronized(this) {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("等待后:2");
}
System.out.println("结束后:3");
}
public void test1(){
Thread thread = new Thread(){
public void run() {
synchronizedDemo();
}
};
thread.start();
}
public void test2(){
Thread thread = new Thread(){
public void run() {
synchronizedDemo();
}
};
thread.start();
}
public static void main(String[] args) {
SynchronizedDemo3 sd = new SynchronizedDemo3();
sd.test1();
//SynchronizedDemo3 sd1 = new SynchronizedDemo3();
sd.test2();
}
}<p>结果如下</p><p>进入方法:1</p><p>进入方法:1</p><p>等待后:2</p><p>结束后:3</p><p>等待后:2</p><p>结束后:3</p>
原文:http://blog.csdn.net/huwenfeng_2011/article/details/44064233