一、结论
1.synchronized可以用于一个类的方法,如public synchronized void writeA,那么同步代码锁定的对象将是当前实例对象,任何现成访问该实例对象的其他同步方法将必须等待,直到方法writeA执行完成
2.synchronized 也可以作用于一个代码块,如synchronized(this){}
3.synchronized 还可以同步一个对象,如synchronized(object){}
二、示例代码
1.TestSynchronize类的代码(测试同步的对象代码)
/**
*
*/
package com.my.test.sychronize;
/**
* 同步类,测试同步的对象代码
*
* @author rey2008
*
*/
public class TestSynchronize {
// 单例对象
static TestSynchronize m_instance = new TestSynchronize();
/**
* 返回单例对象
*
* @return
*/
public static TestSynchronize getInstance() {
return m_instance;
}
public synchronized void writeA(String _FlagThread) {
// 假如执行时间是5秒
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ThreadFlag:::" + _FlagThread);
}
public synchronized void writeB() {
System.out.println("bbbbbbbbbbbb");
}
}
2.TestSynchronizeMain类的代码(测试同步的方法入口)
package com.my.test.sychronize;
public class TestSynchronizeMain {
public static void main(String[] args) {
// 线程1
Thread thread1 = new Thread() {
public void run() {
// 执行方法
System.out.println("线程1准备执行writeA...");
TestSynchronize.getInstance().writeA("aa");
System.out.println("线程1的writeA执行成功...");
}
};
// 线程2
Thread thread2 = new Thread() {
public void run() {
// 执行方法
System.out.println("线程2准备执行writeB...");
TestSynchronize.getInstance().writeB();
System.out.println("线程2的writeB执行成功...");
}
};
// 执行线程
thread1.start();
thread2.start();
}
}
3.打印结果
线程1准备执行writeA...
线程2准备执行writeA...(由于线程1的writeA方法sleep了5秒,所以WriteB必须要等待WriteA执行完成才能够继续执行,虽然线程2没有sleep代码,但是writeB方法还是会在writeA方法执行成功后才输出调试信息)
ThreadFlag:::aa
线程1的writeA执行成功...
bbbbbbbbbbbb
线程2的writeA执行成功...