StringBuffer和多线程

时间:2013-01-28 05:58:53

标签: java thread-safety stringbuffer

StringBuffer可以通过synchronization处理多个线程如果您的文本可以更改,并且将从多个线程访问,请使用StringBuffer,因为StringBuffer是同步的。

任何人都可以解释我多线程何时发生?我们是在实现runnable interface or extending Thread class的程序中创建线程还是基于OS

4 个答案:

答案 0 :(得分:3)

线程可以以多种方式发生。如果您正在创建线程(例如extends Thread),或者您正在创建传递给某种线程模型的对象(例如implements Runnable),或者即使您只是在某处处理类似某些事情的代码事件(例如回调函数)。如何创建线程并不重要。无论如何,当你有这样的事情时:

public String someMethod()
{
    StringBuilder b = new StringBuilder();
    b.append("Some Method");
    return(b.toString());
}

你知道这是线程安全的。对StringBuilder的{​​{1}}方法的任何访问都不需要同步。但是,如果你有类似的东西(只是一个例子):

append()

在这里,您可以看到执行的多个“线程”可以调用public class Test { StringBuffer b; public Test() { b = new StringBuffer(); } public String someMethod() { b.append("Some Method"); return(b.toString()); } } ,并且由于它们都将访问someMethod(),因此需要进行同步。可能是在任何给定时间只有一个线程调用该方法的情况,但是这样写的方式并不禁止2个线程同时调用它。如果使用StringBuffer(非线程安全),您可能会遇到问题。

答案 1 :(得分:2)

'implementing runnable''extending Thread'

如果资源(此处StringBuffer)在多个线程(java进程)之间共享/假设StringBuffer在非监视范围内定义(即在synchronize{}块之外)

在这种情况下,多个线程不会在que中等待访问StringBuffer实例,因为不需要获取监视器/或锁来修改实例。

有关java concurrency

的更多信息

答案 2 :(得分:1)

您需要显式创建额外的Thread,例如,Runnable接口或Thread类,以便将多线程作为一个问题。这也适用于JVM创建额外线程的某些Java EE情况。

如果OS在后​​台使用额外的线程,那么它而不是你负责线程安全,所以这不需要你担心。

您可以在Concurrency section of the Java Tutorials中阅读更多内容。

答案 3 :(得分:1)

让我们让您的程序无法同时执行两个不同的操作/事件。然后你需要考虑Threads。从逻辑的角度来看,multithreading表示单个程序的多行。在这种情况下,操作系统将程序视为两个独立且不同的过程

Java的创建者慷慨地设计了两种创建线程的方法:implementing an interface and extending a class。当您拥有一个日志文件并且多个线程正在记录错误或警告and写入该日志文件时,这是一个简单的案例。

狗的嗅觉是polymorphic。如果狗闻到一只猫,它会吠叫并在它之后跑。如果狗闻到食物的味道,它会垂涎欲滴并跑到它的碗里。在两种情况下,嗅觉都起作用。不同之处在于被闻到的东西,即狗的鼻子所操作的数据类型!

让我们来看一个例子:

//这是我们的主要课程。

class ThreadTest2 {
    public static void main(String args[]){

        Thread thread1 = new Thread(new MyClass("thread1: "));
        Thread thread2 = new Thread(new MyClass("thread2: "));

        thread1.start();
        thread2.start();

        boolean thread1IsAlive = true;
        boolean thread2IsAlive = true;

        do {
            if (thread1IsAlive && !thread1.isAlive()) {
                thread1IsAlive = false;
                System.out.println("Thread 1 is dead.");
            }

            if (thread2IsAlive && !thread2.isAlive()) {
                thread2IsAlive = false;
                System.out.println("Thread 2 is dead.");
            }
        } while (thread1IsAlive || thread2IsAlive);

    }

}

//这是我们的类,它实现了可运行的接口。

class MyClass implements Runnable {
    static String message[] = { "Java", "is", "hot,", "aromatic"};
    String name;

    public MyClass(String id){
        name = id;
    }

    public void run(){

        for(int i=0;i<message.length;++i) {
            randomWait();
            System.out.println(name+message[i]);
        }
    }

    void randomWait(){
        try {
            Thread.currentThread().sleep((long)(3000*Math.random()));
        } catch (InterruptedException x) {
            System.out.println("Interrupted!");
        }
    }
}

该程序从MyThread类创建两个执行线程thread1 and thread2。然后它启动两个线程并执行一个等待线程死亡的do语句。线程显示Java很热,很芳香。逐字消息,同时在每个单词之间等待一段短暂的随机时间。 Because both threads share the console window,程序的输出标识在程序执行期间的不同时间哪些线程能够写入控制台。