Безопасность нитей буфера строк - PullRequest
0 голосов
/ 08 октября 2018

StringBuffer известен как поточно-ориентированный в Java, что означает, что он обеспечивает синхронизированный доступ ко многим потокам. Но когда я запускаю приведенный ниже код, он не запускается так же, как в блоке синхронизации. Что мне здесь не хватает?

class Hackerearth{
    static StringBuffer s = new StringBuffer("String Buffer Multithreading test");
    public static void main(String args[] ) throws Exception {
        Thread t1 = new Thread(new Runnable(){
            public void run(){
                Thread1();
            }
        });
        Thread t2 = new Thread(new Runnable(){
            public void run(){
                Thread2();
            }
        });
        t1.start();
        t2.start();
    }


    public static void Thread1(){
        for(int i = 0; i < s.length(); i++){
            s.setCharAt(i, ((char) ((int) (Math.random() * 26) + 97)));
            System.out.println("Thread is: " + Thread.currentThread().getName() + ".S is: " + s);
            if(i == s.length() - 1){
                try {
                    Thread.sleep(2000);
                    s = new StringBuffer("String Buffer Multithreading test");
                } catch (InterruptedException ex) {
                    System.out.println(ex.getMessage());
                }
            }
        }

    }

    public static void Thread2(){
        for(int i = 0; i < s.length(); i++){
            s.setCharAt(i, ((char) ((int) (Math.random() * 26) + 97)));
            System.out.println("Thread is: " + Thread.currentThread().getName() + ".S is: " + s);
            if(i == s.length() - 1){
                try {
                    Thread.sleep(2000);
                    s = new StringBuffer("String Buffer Multithreading test");
                } catch (InterruptedException ex) {
                    System.out.println(ex.getMessage());
                }
            }
        }

}
...