处理许多客户机的Java静态同步方法是混搭数据

处理许多客户机的Java静态同步方法是混搭数据,java,synchronized,Java,Synchronized,我有一个javaws应用程序,在服务器端运行一段代码。下面是一个简单的例子: public class Stuff { public static synchronized coolStuff(String something, String somethingElse) { System.out.println("It is a: " + something); System.out.println("It is also a: " + som

我有一个javaws应用程序,在服务器端运行一段代码。下面是一个简单的例子:

public class Stuff {

    public static synchronized coolStuff(String something, String somethingElse)
    {
        System.out.println("It is a: " + something);
        System.out.println("It is also a: " + somethingElse);
    }
}
我让多IP客户端(400+)通过控制器调用这段代码,最后将以下内容发送到服务器端:

Clinet 1: coolStuff("BIG TRUCK", "BIG CAR");
Client 2: coolStuff("BIG TV", "BIG PHONE");
服务器端将打印(记录)这两个请求的混合,例如:

It is a: "BIG TV"
It is also a "BIG_CAR"

我不确定这是怎么发生的,因为我的服务器方法是同步的。请记住,这只是一个随机代码示例。我是否遗漏了一些基本内容?

是否涉及多个JVM实例
synchronized
只能在其自身范围内作出保证。@Sotirios抱歉,我无意中删除了以前的代码。是的,存在一个
synchronized
块,因此我检查了规范是否会出现关于多个
println
的奇怪情况,虽然逻辑上不是。当然,混合来自方法的初始调用方,可能本身不是线程安全的,与预期输出冲突。仅因为System.out.println在java代码中是同步的,并不保证将文本传递给的主机平台对实际控制台缓冲区保留顺序做出任何保证。内容只保证以特定顺序从JVM传递到主机系统,然后java就失去了控制。当您在IDE内部运行时,这一点尤其明显,IDE会将系统控制台捕获并重定向到外部。产生几百个线程并尝试以正常同步的方式写入,您将得到垃圾。@zapl是的,有几个服务器实例在同一服务器上的同一tomcat实例上运行。因此,它们之间唯一的区别是webapp名称(mywebapp1、mywebapp2等)。我曾想过,如果两个Web应用程序在同一个JVM下运行可能会导致混淆,但我怀疑,如果我的应用程序可以像那样连接另一个应用程序,这将是一个主要问题。如果您确定已同步静态方法,并且日志记录仅在该静态方法中发生,并且您确定只有1个JVM,然后一种可能性是,可能有超过1个类加载器加载包含该静态方法的类(可能由多个web应用程序引起,或者在热重新部署期间,等等)。在这种情况下,内存中存在该类的多个副本,导致同步无法按预期工作。