首先,需要说明一点,也是最重要的一点,无论是同步方法 还是 同步块 都是只针对同一个对象的多线程而言的,只有同一个对象产生的多线程,才会考虑到 同步方法 或者是 同步块,如果定义多个实例的同步,可以考虑使用mutex,创建类似于c++整个服务全局锁,或者创建一个全局单例类,在其内定义全局锁。比如以下的代码片段定义线程同步无任何意义:
public class Test1 implements Runnable
{
public void run()
{
synchronized(this)
{
try
{
System.out.println(System.currentTimeMillis());
Thread.sleep(2000);
System.out.println(System.currentTimeMillis());
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args) {
for(int i=0;i<10;i++) {
new Thread(new Test1()).start(); // 关键,如果将 new Test1拿到外面,那么同步方法才有意义,如下:
//public static void main(String[] args) {
// Test1 test=new Test1();
// for(int i=0;i<10;i++) {
// new Thread(test).start();
}
}
}
|