Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象之间的私有变量共享_Java - Fatal编程技术网

Java 对象之间的私有变量共享

Java 对象之间的私有变量共享,java,Java,我上的课看起来像 public class Sender { private LoggingAdapter log = Logging.getLogger(this.toString()); private final ArrayList<CSAMessage> sentHistory = new ArrayList<>(); public void send(final CSAMessage message) { doSend(

我上的课看起来像

public class Sender {
    private LoggingAdapter log = Logging.getLogger(this.toString());
    private final ArrayList<CSAMessage> sentHistory = new ArrayList<>();

    public void send(final CSAMessage message) {
        doSend(message);
        sentHistory.add(message);
    }

    private void doSend(CSAMessage message) {
        //do send stuff
    }
}
但这将是性能瓶颈——许多发送者必须能够同时工作。我为什么要这样做?不同的实例必须使用它自己的变量

还有一些日志变量以相同的方式声明,但日志变量不是在对象之间共享的,每个发送者都以自己的名称写入日志。

标记变量
final
,并以您所做的方式初始化它

private final ArrayList<CSAMessage> sentHistory = new ArrayList<>();
//      ^^^^^                                   ^^^^^^^^^^^^^^^^^^^
private final ArrayList sentHistory=new ArrayList();
//      ^^^^^                                   ^^^^^^^^^^^^^^^^^^^
使多个实例完全不可能共享同一个
ArrayList


但是,仍然有可能的是,多个
ArrayList
s共享
CSAMessage
的相同实例。当共享的
CSAMessage
s是可变的时,可能会产生共享的幻觉。例如,如果
CSAMessage
有一个指向
Sender
的链接,该链接被设置为
send
调用的一部分,同时进行更改可能会显示消息,就好像它是通过错误的发件人发送的一样。

标记变量
final
,并以您所做的方式初始化它

private final ArrayList<CSAMessage> sentHistory = new ArrayList<>();
//      ^^^^^                                   ^^^^^^^^^^^^^^^^^^^
private final ArrayList sentHistory=new ArrayList();
//      ^^^^^                                   ^^^^^^^^^^^^^^^^^^^
使多个实例完全不可能共享同一个
ArrayList


但是,仍然有可能的是,多个
ArrayList
s共享
CSAMessage
的相同实例。当共享的
CSAMessage
s是可变的时,可能会产生共享的幻觉。例如,如果
CSAMessage
有一个指向
Sender
的链接,该链接被设置为
send
调用的一部分,则同时进行更改可能会将消息显示为通过错误的发件人发送。

你是对的。这种情况决不能发生,而且它不太可能像你描述的那样发生。Java中的这种错误会影响所有程序。您调试它一定是出错了。那么,您使用的是什么日志API呢?最佳猜测:
Logging.getLogger(this.toString())
映射到同一个记录器,因为
toString()
为两个实例返回相同的值看起来问题出在日志上,而不是实际的数组列表上-
Sender
的两个实例无法共享该列表(除非您使用反射api将其设置为这样)。尝试从您描述的代码位编写一个-,您的问题不可能重现。日志如何确定消息添加到了谁?(own/senderX)你是对的。这种情况一定不会发生,而且它不太可能以你描述的方式发生。Java中的这种错误会影响所有程序。调试它一定是你自己的错误。那么,你使用的是什么日志API呢?最好的猜测是:
logging.getLogger(this.toString())
映射到同一个日志,因为
toString()
为两个实例返回相同的值看起来问题出在日志上,而不是实际的数组列表上-发送方的两个实例无法共享该列表(除非您使用反射api将其设置为这样)。试着写一个-从您描述的代码位来看,您的问题不可能重现。日志如何确定消息添加到了谁?(own/senderX)问题是消息是由正确的发件人发送并发送到正确的收件人的,没有任何问题,但随后它们被添加到另一个实例的ArrayList中。并且no-CSAMessage没有指向发送消息的发件人的链接。@Asprelis是共享的消息吗?消息是可变的吗?消息是可变的。但发件人的两个实例接收到的消息相同Message对象是从不同线程动态修改的,您是对的。list.hashcode()是列表中所有元素的hashcode。相同的元素-列表的hashcode相同,这就是我决定共享列表的原因。问题是消息是由正确的发送者发送的,并发送到正确的接收者,没有任何问题,但随后它们被添加到另一个实例的ArrayList中。并且no-CSAMessage没有指向发送消息的发送者的链接ent.@Asprelis是共享的消息吗?消息是可变的吗?消息是可变的。但是发送者的两个实例都收到了相同的消息对象,这是从不同线程动态修改的,你是对的。list.hashcode()是list中所有元素的hashcode。相同的元素-列表的相同hashcode,这就是我决定共享列表的原因。
private final ArrayList<CSAMessage> sentHistory = new ArrayList<>();
//      ^^^^^                                   ^^^^^^^^^^^^^^^^^^^