synchronized关键字可以用于声明方法,也可以用于声明代码块;
package com.test.java;
public class SyncTest {
public static void main(String[] args) {
SynchronizedDemo1 synct1 = new SynchronizedDemo1();
SynchronizedDemo2 synct = new SynchronizedDemo2();
SynchronizedDemo2 synct2 = new SynchronizedDemo2();
Thread t = new Thread(){
@Override
public void run() {
SynchronizedDemo1.foo1();
}
};
Thread t2 = new Thread(){
@Override
public void run() {
synct1.foo2();
}
};
t.start();
t2.start();
System.out.println("-------------");
}
}
/**
* 静态方法修饰, 全局阻塞(调用方法则阻塞)
* 在不同线程中,这个两个方法调用时互斥的
* @author 63176
*/
class SynchronizedDemo1{
public synchronized static void foo1(){
System.out.println("foo1被执行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo1未执行结束");
}
public synchronized static void foo2(){
System.out.println("foo2被执行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo2执行结束");
}
}
/**
* 同一对象方法调用阻塞测试
* 针对同一个对象的多线程方法调用互斥
* @author 63176
*
*/
class SynchronizedDemo2{
public synchronized void foo1(){
System.out.println("foo1被执行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo1未执行结束");
}
public synchronized void foo2(){
System.out.println("foo2被执行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo2执行结束");
}
}
/**
* 块阻塞 -
*
* @author 63176
* synchronized this时,仅锁定当前对象引用;
* synchronized 类时,锁定类,与静态方法是互斥的
*/
class SynchronizedDemo3{
public void foo1(){
synchronized (this) {
System.out.println("foo1被执行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo1未执行结束");
}
}
public void foo2(){
synchronized (SynchronizedDemo3.class) {
System.out.println("foo2被执行了");
try {
Thread.sleep(5000000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("foo2执行结束");
}
}
}
当线程进入第一个方法时,方法处理中,则其余线程访问对应其他方法时,需等待第一个完成;