Java多线程概念

Java多线程概念,java,multithreading,Java,Multithreading,我有一个关于多线程的问题 假设我想同时执行两个操作,就像我想向文件中添加一个朋友记录一样,并且同时使用并发线程显示朋友记录 我创建了一个启动的线程,它负责显示,在启动线程的main方法中,我执行了将记录保存到文件的操作 这两个过程是否同时发生 这是我代码的一部分 Runnable2 r2 = new Runnable2(L) ; Thread t2 = new Thread(r2); t2.start(); F.addElement(L); oos1.writeObject(F); 没有同时

我有一个关于多线程的问题

假设我想同时执行两个操作,就像我想向文件中添加一个朋友记录一样,并且同时使用并发线程显示朋友记录

我创建了一个启动的线程,它负责显示,在启动线程的main方法中,我执行了将记录保存到文件的操作

这两个过程是否同时发生

这是我代码的一部分

Runnable2 r2 = new Runnable2(L) ;
Thread t2 = new Thread(r2);
t2.start();

F.addElement(L);
oos1.writeObject(F);

没有同时发生的事情。一个将在另一个之前发生,但是,如果不使用显式同步机制,则无法知道将首先执行哪个(这取决于操作系统、硬件和JVM)。很可能,如果你运行程序100次,事件1会在事件2之前运行99次,最后一次它以相反的方式发生,你会得到一个很难重现的bug


您真的不应该依赖顺序,在使用多线程时应该使用同步机制。

您启动了一个线程,因此Runnble2的run()方法中的代码在单独的线程中执行,是的。请遵守Java命名约定,选择描述性名称,而不是F、L、r2、t2和Runnable2。它们可能同时出现。如果你的硬件和其他因素真的这样做了,那就要看它们了。如果java没有自动将独立的代码分离到不同的线程,那么你可以对串行代码和线程代码进行基准测试,并比较计时。为什么不会同时存在这样的事情呢?现在大多数计算机都有多核。因此,多个事物可以同时执行。@JBNizet学术文献仅使用“同时”一词来描述离散事件之间的关系(例如,内存访问)。当他们谈论过程/函数/方法调用(即事件序列)时,这些调用要么是“重叠的”,要么不是。SMP计算机中的某些事件可以同时发生,但有趣的事件永远不会发生:例如,硬件永远不会允许两个不同的处理器同时更新同一主内存位置。因此,在严格的计算机科学语言中,“同时”一词没有任何有用的含义。这不是学术文献。这是关于两个线程的指令是否同时执行的简单英文注释。它们在一个多代码机器中。