繁体   English   中英

Java MULTITHREADING-当多个线程访问print方法时-为什么默认情况下同步while方法的执行

Java MULTITHREADING - when multiple threads accesses the print method - why the execution of while method is by default synched

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

对多线程有疑问。 以下是我访问文件的主程序,正在创建10个要在对象上访问的线程。

public class CallTest {
    public static void main(String[] args) throws Exception {
        Test t = new Test();
        for (int i = 0; i < 10; i++) {
            Thread t1 = new Thread(t);

            t1.start();

        }

    }
}

以下是我从文件中读取数据的程序。

public class Test implements Runnable {
    static int i;
    public void run() {
        try {
            i++;
            System.out.println("@@@@Count" + i);
            print();
        } catch (Exception e) {}
    }

    public void print() {
        try {
            StringBuilder bufData = new StringBuilder();
            File fileTest = new File("D:\\Work\\i466477");
            BufferedReader bufferedReader1 = new BufferedReader(new FileReader(
                    fileTest));
            String strRecord = new String();
            while ((strRecord = bufferedReader1.readLine()) != null) {
                bufData.append(strRecord);
                bufData.append("\r");
                bufData.append("\n");
            }
            bufferedReader1.close();
            System.out.println("########");
            System.out.println(bufData);

        } catch (Exception exe) {
            System.out.println(exe);
        }
    }
}

在这里,我可以看到while默认情况下是同步的代码, BufferedReader线程安全还是因为每个线程将拥有自己的StringBuilderBufferedReader副本? 我可以看到内容已正确读写。

5 个回复

不,默认情况下该代码不会同步。 多个线程可以同时处于while循环中。 “已同步”与“没有任何问题地工作”是不同的-您是否认为已同步是因为没有问题? 在Java中, synchronized大约只允许一个线程一次执行与特定监视器有关的某些关键代码段。

请注意,顺便说一下,您在run方法中对i的访问是不安全的。 您还应该在finally块中关闭BufferedReader ,并避免捕获Exception 最后,将new String()分配给strRecord开始是毫无意义的。 希望这些只是错误,因为它是测试代码,但值得警惕。

实际上,System.out.println是同步的。 没有这些,再试一次。

每个线程都有其自己的StringBuilder,BufferedReader和FileReader(以及操作系统级别的文件描述符),因此该级别不会有任何干扰。 (这些类都不是线程安全的,但是实例是线程限制的,所以没关系。)

在编写时, PrintWriter.print(...)PrintWriter.println(...)方法是同步的,这说明了为什么看不到各个println调用的输出混合在一起的原因。 (PrintWriter是线程安全的……并且必须是线程安全的。)

注意:如果您更改了代码以在每个println'ed字符串中包含线程号,则有时可能会看到输出以意外的顺序出现。 在同一对象(PrintWriter)上对线程安全方法的单独调用不一定按“先到先得”顺序进行。


更新静态变量i的代码不是线程安全的,并且可能时不时地给您带来意想不到的(错误的)结果,具体取决于您使用的硬件/ JVM。 您应该以synchronized static方法进行更新,或者将i替换为AtomicInteger

线程之间不共享bufferreader和stringbuilder,因此它们的使用是线程安全的。

StringBuffer在某种程度上是线程安全的,因为其所有方法都是同步的。 BufferedReader不是线程安全的。

局部变量是线程限制的 但是对静态变量i的非原子操作(如i++ )不是线程安全的。

1 具有两个线程的Java多线程同步方法

我有一个非常简单的代码,但无法理解。 这是我的问题 当两个线程执行Test t = new Test() ,这是否会创建两个具有相同名称的不同对象? 这条线有多个线程会发生什么? 我的成绩低于预期, 我在睡觉...线程-0 我在睡觉...线程-1 ...

3 同步多个方法访问

我需要同步一个mysql查询,因此只有一个用户可以同时访问指定的部分。 我尝试了synchronized(){} ,但这是行不通的。 用户可以同时访问该方法。 这是一个使用tomcat6的jsp Web应用程序。 我需要这样做,因为当太多用户同时运行查询时,Web服务器崩溃。 谢 ...

4 java方法中的多线程

我有一个方法,我想一次运行两个线程。 下面是方法 我想运行bulkMailProcessor.processor(reapExcelDataFile); 行,我不想等到邮件发送过程完成,主线程需要继续发送邮件,但另一个线程需要启动并将结果发回。 我怎样才能实现这个功能。 ...

6 通过Java中的线程控制方法的执行

我需要两个类,一个类有两个方法,每个方法需要一段时间才能完全执行。 向第二类提供信息,该信息将决定第一类中两个方法中的哪一个将执行。 但是重要的是,如果第二个类(将在其自己的线程中同时执行)决定两个方法中的另一个应该执行,则第一个类将直接执行另一个方法而不必等待首先完成。 如果类A有两 ...

9 Java中有多个线程访问同一方法时的线程安全

我有这样的方法 如果多个线程同时调用此方法,是否将在多个线程之间共享数据值? 就像线程A通过handleString(objFromThreadA)调用此方法一样,线程B通过handleString(objFromThreadB)调用此方法。 会不会有那的价值任何机会String ...

10 在线程进行多次访问的情况下,SerialPort.Write方法是否受上下文切换影响?

如标题所述,我想知道如果不同的线程尝试写入同一共享串行端口,上下文切换是否会影响SerialPort.Write方法以及该方法如何受到影响。 例如,假设我们有两个线程A和B,并且在此示例中A在B之前被调用。 线程A希望在某个时候这样做: 和线程B这: 输出会发生什么? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM