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 중국어 웹사이트의 기타 관련 기사를 참조하세요!