针对线程同步,做了个小例子。
1.多线程实例化多个对象,调用同步方法
2.多线程通过单例,调用同步方法
public class MyTest {
private MyTest(){}//单例对象不被创建
public static MyTest myTest = null;//方便测试,就不写
public static void main(String[] args) {
Thread t1 =new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
//getInstance().testSync();//单例
new MyTest().testSync();//非单例
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
t1.setName("线程1");
Thread t2 =new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
//getInstance().testSync();//方式1 单例
new MyTest().testSync();//方式2 非单例
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
t2.setName("线程2");
t1.start();
t2.start();
}
synchronized public void testSync() throws InterruptedException{
System.out.println(Thread.currentThread().getName());
Thread.sleep(3000);
}
public static MyTest getInstance(){
if(null==myTest){
myTest = new MyTest();
return myTest;
}else{
return myTest;
}
}
}
方式1输出结果(单例):
线程1/2
等待三秒
线程1/2
等待三秒
方式2输出结果(非单例): 线程1/2 线程1/2 等待三秒 等待三秒 方式2 等待三秒 也可能会在两个线程中间。 这里需要说明的是多例的情况下,线程1所持的锁跟线程2不发生关系。两个线程调用的方法,也不是同一个方法, 只是实例化同一个CLASS类,方法相同,却不是同一个。