>  기사  >  Java  >  동기화된 방법이 비동기화된 방법에 어떤 영향을 미치나요?

동기화된 방법이 비동기화된 방법에 어떤 영향을 미치나요?

一个新手
一个新手원래의
2017-10-10 09:31:191695검색

StringBuilder는 스레드에 안전하지 않은 클래스입니다.

StringBuffer는 그 안의 메소드가 동기화되기 때문에 스레드로부터 안전합니다.

오늘 저는 이를 테스트하기 위해 코드 조각을 작성했습니다. 루프를 사용하여 10개의 스레드를 열고 StringBuffer(StringBuilder)의 추가를 호출하여 1에 10을 더합니다.

결과는 예상대로입니다. 스레드 안전하지 않은 StringBuilder는 일부 숫자를 누락하고


public static void main(String[] args) throws InterruptedException {
        StringBuffer buffer = new StringBuffer();
        StringBuilder builder = new StringBuilder();        // 开启十个线程,分别对buffer 和 builder 操作        
        for(int i = 0; i < 10; i++) {            
            int j = i;            
            new Thread(new Runnable() {                
            public void run() {                    
            try {
                        Thread.sleep(500); //造成阻塞
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    builder.append(j);
                }
            }).start();
        }        //等待以上操作完成
        Thread.sleep(1000);        // 打印结果
        System.out.println("builder:"+builder);
    }

스레드 안전 StringBuffer는 10개의 숫자를 모두 추가합니다. 언제: 빌더와 버퍼를 동시에 작동시키고 버퍼의 추가를 먼저 호출하면 빌더와 버퍼가 동일한 스레드에 있기 때문에 각 작업이 수행되고 빌더의 메소드가 "동기화"된 메소드로 전환됩니다. 버퍼가 스레드를 차단하기 때문입니다. 마찬가지로 10개의 숫자를 추가했습니다


public static void main(String[] args) throws InterruptedException {
    StringBuffer buffer = new StringBuffer();
    StringBuilder builder = new StringBuilder();    // 开启十个线程,分别对buffer 和 builder 操作        
    for(int i = 0; i < 10; i++) {        
        int j = i;        
        new Thread(new Runnable() {            
        public void run() {                
        try {
                    Thread.sleep(500); //造成阻塞
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                buffer.append(j);
            }
        }).start();
    }    //等待以上操作完成
    Thread.sleep(1000);    // 打印结果
    System.out.println("buffer:"+buffer);
}

위 내용은 동기화된 방법이 비동기화된 방법에 어떤 영향을 미치나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.