public class Test{
     public synchronized void test(){
           System.out.println("线程安全");
     }
}
Test test1 = new Test();
test1.test();Test test2 = new Test();
test2.test();上面的代码应该是先由test1执行test()方法完毕后再由test2执行test()方法,但是我查了相关资料,发现synchronized关键字当不是同一对象时,不会进行线程安全操作。  
如上例test1和test2不是同一对象,虽然调用test()方法,但是不会进行线程安全。test2.test()可能会先执行,我知道有种方法,就是将Test写成单例类,让对象始终唯一的话, 可以对test()方法进行线程安全操作但是还有种情况呢?就是如果我将Test类的test()方法声明为静态的
public synchronized static void test(){
           System.out.println("线程安全");
     }
然后进行操作
Test.test();  
Test.test(); 
一定会进行线程安全操作吗?

解决方案 »

  1.   

    不要看我test()方法内的内容。我说关键在于 不同Test对象方法test()方法时会不会进行加锁如果对象不同的话,是不会进行加锁的,
    就是说test1和test2 是 实例化Test类的2个不同对象,当这2个不同对象调用Test的test()方法时可能不会按照顺序。不会等到test1.test()方法执行完毕后再去执行test2.test()方法。所以好象要将Test类做成单例类 或者  在test()方法声明static就可以对test()方法进行加锁?
    才可以正确的调用这个方法的所有的对象,等待前面的对象执行完毕后再调用?
      

  2.   

    我应该说错了。不是说线程安全。
    如果test1先执行test()方法,会不会test2.test()在test1.test()没执行完全后就进入了,达不到synchronized的作用。如果要test1.test()先执行完毕后再执行test2.test()方法,应该做什么操作。
      

  3.   

    线程安全是指对同一内存资源的安全访问,你生成了2个test对象,它们在内存中占有不同的地址,线程安全对它没有意义。
    可用单例模式或者将该方法设为静态方法来实现你的目的。
      

  4.   

    lz可以学习一下ThreadLocal,spring,hibernate等都是用这种方式来实现线程安全的
      

  5.   

    synchronized关键字是实现线程同步操作,在方法前加该关键字,说明在调用该方法返回结果之前任何其他方法都不能调用被synchronized关键字修饰的方法,从而保证一段时间内只能有一个方法调用。从而实现线程的同步操作。
      

  6.   

    那现在有一个购买商品的方法public synchronized void buy();  现在商品只有1件了。我只让第一个访问这个方法的人购买
    没有用hibernate等框架,就简单的用JDBC去调用这个方法
    JSP里写  Test test = new Test(); test.buy();如果多人同事访问这个JSP,你觉得还会不会打达到我只允许第一个抢到的人买这件商品的效果呢。
    因为我网上查询到  第一人new Test() 第二个人又new Test  这些new 的 Test都不是同一个对象,是达不到线程安全的,
    所以crasy_potato他说的是对的,你们觉得呢。