우리는 스레드로부터 안전 동기화 사용해야합니다?

동기화의 방법은, 정말 반드시 스레드 안전 동기와하지, 간단한 예를 살펴

 

 

위의 코드는 결과를 실행합니다 :

 

 

즉,하지 않았다 200 만, 왜 동기화 된 키워드와 F1과 F3 방법,하지만 우리가 그것을 필요로하는 결과를 달성하지 않았다? 의 동기화의 원칙에서 시작이 필요에 대해 얘기하자.

동기화 된 키워드는 다음과 같은 세 가지 용도로 사용 :

수정 방법의 예 : 현재 인스턴스 로크가 현재 인스턴스 로크를 얻기 위해 필요한 입력 방법

정적 메서드를 수정 : 정적 방법으로 잠금 현재 클래스 객체가 현재 객체 잠금을 얻을 필요

코드 블록 수정 : 코드 블록으로 지정된 개체를 고정 잠금 개체를 지정해야

그래서 차이점은이 세 가지 방법을합니까? 기본 의미가 동기화 이해하는 것이 필요하다. 자바 동기화 항목을 기반으로 달성 튜브 (Moniter) 개체를 명시 적으로 동기화 (일반 monitorenter 및 monitorexit 지침, 즉, 동기화 코드 블록) 모두 또는 암시 적 동기화를 종료한다 (동기화 방법에의 호출 명령 읽기 ACC_SYNCHRONIZED 프로세스 플래그는 암시 적으로 구현 정수 풀을) 런타임합니다.

객체 기반 구현에서 봐, 우리는 자바 객체에서 알 필요가있다. 제 객체 인스턴스 변수 패딩 데이터 다음 JVM에서, 메모리 내의 객체 영역을 세 부분으로 나누어진다.

 

 

변수의 예로는 : 그것은 상기 어레이의 부분 배열의 길이 배열이 메모리 (4) 바이트를 포함하는 경우, 상위 클래스를 포함한 속성 정보, 예컨대 데이터로서 예를 속성 정보를 저장하는 단계를 포함한다.

패딩 데이터 : 가상 머신이 시작-요청 때문에 객체 주소는 8 바이트의 정수 배수 여야합니다. 패딩 데이터가 존재할 필요는없고, 단지 바이트 정렬이 이해 될 수있다.

개체 머리 : 동기화 락 객체의 기초가된다. 잠금 객체가 미리 저장 자바 객체를 사용하여 동기화, 주요 구조는 마크 말씀과 구성 주소 클래스 메타 데이터로 구성되어있다.

 

 

해시 마크 워드는 기본에 저장된 객체이고, 등 마크 말씀의 다음과 같은 32 비트 JVM의 기본 저장 구조 세대 세 잠금 플래그

 

 

synchronized的对象锁,锁标识位为10,其中指针指向的是monitor对象(也称为管程或监视器锁)的起始地址。每个对象都存在着一个 monitor 与之关联,对象与其 monitor 之间的关系有存在多种实现方式,如monitor可以与对象一起创建销毁或当线程试图获取对象锁时自动生成,但当一个 monitor 被某个线程持有后,它便处于锁定状态。

了解了对象头,我们就可以知道为什么上面的代码虽然都使用了synchronized修饰,但是还是有线程安全问题,因为静态方法和实例方法锁的对象是不一致的(Monitor不是同一个),所以导致最终没有达到预期效果。

 

 

추천

출처froest.iteye.com/blog/2441330