차이점: jdk1.8에서는 영구 생성이 취소되고 Metaspace로 대체되었습니다. 이 공간은 jvm 가상 머신의 메모리를 차지하지 않지만, jdk8은 람다 표현식, 로컬 변수에 대한 액세스를 추가합니다. 함수형 인터페이스 및 기타 기능.
jdk1.7과 jdk1.8의 비교
1.jdk1.7 구문
1) 바이너리를 사용하여 0b부터 시작하는 정수를 나타낼 수 있습니다.
2) Switch 문은 문자열 유형을 지원합니다
3) try 블록은 finally 없이 수동으로 닫을 수 있으며, try 블록에서 직접 닫을 수 있습니다.
4) 여러 예외를 포착합니다. 참고: Catch 예외 유형은 최종 유형이므로 수정할 수 없습니다. 이 기능은 더 적은 바이트코드를 생성하고 코드 중복을 줄입니다. 예외를 다시 발생시킬 때 예외 유형을 유지하십시오.
5) 숫자에 밑줄을 사용할 수 있어 더욱 친근합니다. 그러나 밑줄 추가 규칙에 주의하십시오. 밑줄은 숫자 사이에만 사용할 수 있습니다. 숫자의 시작이나 끝 부분에는 밑줄을 사용할 수 없습니다.
6) 제네릭 인스턴스 생성 시 변수 선언 시 제네릭 유형을 기반으로 인스턴스의 제네릭 유형이 자동으로 유추됩니다.
7) 컴파일 경고 및 오류를 개선하려면 가변 매개변수 메서드에 구체화되지 않은 매개변수를 전달하세요.
8) 더 많은 정보를 제공하는 역추적.
2. NIO2의 몇 가지 새로운 기능
1) 비동기 비차단 IO 및 Proactor 구현
2) 파일 트리, 파일 확장자 검색
3)을 사용할 수 있습니다. try-with-resources는 Connection, ResultSet 및 Statement 리소스 개체를 자동으로 닫습니다.
2) RowSet1.1(인터페이스 모델): RowSetFactory 인터페이스와 RowSetProvider 클래스를 도입하면 JDBC 드라이버에서 지원하는 다양한 행 집합을 생성할 수 있습니다. 여기서 행 집합 구현은 실제로 SQL 문의 일부 작업을 메서드 작업으로 변환하는 것입니다. 일부 기능을 캡슐화합니다. 3) JDBC-ODBC 드라이버는 jdk8에서 삭제됩니다.4. 동시성 도구 개선
1) Fork/Join 프레임워크는 작업을 병렬로 실행하기 위해 Java7에서 제공하는 프레임워크로, 큰 작업을 여러 개의 작은 작업으로 나누어 최종적으로 요약하는 프레임워크입니다. 각 작업. 작은 작업의 결과 후에 큰 작업의 결과를 얻기 위한 프레임워크입니다. (멀티 코어 기능을 최대한 활용하여 큰 문제를 하위 문제로 분해합니다. 여러 CPU는 동시에 여러 하위 문제를 해결하고 최종적으로 결과를 병합할 수 있습니다.)
2) ThreadLocalRandon은 동시 난수 생성의 스레드 안전성을 보장하기 위한 동시 난수 생성 클래스입니다. 실제로는 threadlocal을 사용합니다. 3) Phaser 클래스java5에는 동시 패키지가 있습니다. 세마포어(semaphore), CountDownLatch(잠금), CyclicBarrier(펜스)가 있습니다. 페이저 클래스는 CountDownLatch 및 CyclicBarrier를 최적화합니다.세마포
: 세마포어는 여러 잠금을 선언할 수 있습니다(한 개의 잠금 포함: 이는 상호 배타적인 세마포입니다).예: 방에 5명만 수용할 수 있는 경우 추가 인원은 문 밖에서 기다려야 합니다. 어떻게 하나요? 한 가지 해결책은 방 밖에 열쇠 5개를 걸어두고, 들어가는 사람마다 열쇠 하나씩을 가져가는 것입니다. 열쇠가 없는 사람은 방에 들어갈 수 없고 밖에서 기다리게 됩니다. 나오는 사람은 다른 사람이 다시 들어가기 쉽도록 열쇠를 원래 위치에 되돌려 놓습니다.
주로 접근할 수 있는 최대 스레드 수를 제어하는 데 사용됩니다. 기본값은 불공평합니다. 잠금의 공정성은 생성자를 통해 명시적으로 선언될 수 있습니다.
래칭:의미: CountDownLatch는 초기화 중에 초기 값을 설정하는 카운터로 이해될 수 있습니다. 스레드가 특정 작업이 먼저 완료될 때까지 기다려야 하는 경우 wait() 메서드를 호출해야 합니다. 이 메서드는 대기 중인 모든 스레드가 실행을 완료할 때까지 스레드를 절전 모드로 전환합니다. countDown() 메서드가 호출될 때마다 내부 카운터는 카운터가 0에 도달하여 깨어날 때까지 1씩 감소합니다. 이는 특별한 CyclicBarrier로 이해될 수 있습니다. 스레드 동기화 지점은 특별하며 내부 카운터 값이 0에 도달할 때 시작됩니다.
메서드: 두 가지 핵심 메서드: countDown() 및 wait(). countDown(): CountDownLatch에 의해 유지되는 내부 카운터를 1씩 감소시키고 각 대기 스레드가 완료될 때 이를 호출합니다. await(): 스레드가 CountDownLatch를 실행하면 스레드가 절전 모드로 전환됩니다. 예: 회의 예: 회의가 시작되기 전에 모든 참가자가 도착할 때까지 회의실에서 기다립니다.펜스:
의미: 펜스는 두 개 이상의 스레드가 특정 랑데부 지점에서 동기화되도록 허용합니다. 스레드가 랑데부 지점에 도달하면 wait() 메서드를 호출하여 다른 스레드를 기다립니다. 스레드가 wait() 메서드를 호출한 후 CyclicBarrier는 스레드를 차단하고 다른 스레드의 도착을 기다리기 위해 해당 스레드를 절전 상태로 전환합니다. 마지막 스레드가 wait() 메서드를 호출하면 CyclicBarrier는 대기 중인 모든 스레드를 깨운 다음 해당 스레드가 계속 실행됩니다. CyclicBarrier는 다른 Runnable 객체를 초기화 매개변수로 전달할 수 있습니다. 모든 스레드가 집결 지점에 도착하면 CyclicBarrier 클래스는 Runnable 개체를 스레드로 실행합니다.
메서드: wait(): 마지막 스레드가 도착할 때까지 스레드를 휴면 상태로 두고 모든 휴면 스레드를 깨웁니다.
과 CountDownLatch의 차이점:
모든 스레드가 랑데부 지점에 도착한 후 후속 실행을 위해 Runnable 유형 개체를 허용합니다.
CountDown() 메서드를 호출하는 표시가 없습니다
CountDownLatch는 일반적으로 한 번만 사용할 수 있습니다. , CyclicBarrier는 여러 번 사용할 수 있습니다
응용 시나리오: 여러 스레드가 작업을 수행한 다음 동기화를 위한 랑데뷰 지점에 도달한 후 요약을 위해 후속 스레드로 넘겨줍니다.
Phaser:의미: 더욱 복잡하고 강력한 동기화 보조 클래스입니다. 다단계 작업을 동시에 실행할 수 있습니다. 동시 작업이 있고 이를 실행을 위해 여러 단계로 나누어야 하는 경우(CyclicBarrier는 두 단계로 나뉩니다) Phaser를 사용하도록 선택할 수 있습니다. Phaser 클래스 메커니즘은 각 단계가 끝날 때 스레드를 동기화합니다. 모든 스레드가 이 단계를 완료하면 다음 단계가 실행될 수 있습니다. 다른 동기화 도구와 마찬가지로 Phaser 클래스에서 동기화 작업에 참여하는 작업 수를 초기화해야 합니다. 차이점은 작업 수를 동적으로 늘리거나 줄일 수 있다는 것입니다.
기능: receiveAndAwaitAdvance(): CyclicBarrier의 wait() 메서드와 유사하며 다른 스레드가 도착할 때까지 기다리고 동기적으로 실행을 계속합니다. ArrivalAndDeregister(): Phaser에서 여기에서 실행된 스레드를 로그아웃합니다. isTerminating(): Phaser가 종료되었는지 확인합니다. 등록(): 새 참가자를 Phaser에 등록합니다. 이 새 참가자는 이 단계를 완료하지 않은 스레드로 간주됩니다. forceTermination(): Phaser를 강제로 종료 상태로 전환합니다
예: Phaser 클래스를 사용하여 세 가지 동시 작업을 동기화합니다. 이 세 가지 작업은 세 가지 다른 폴더와 해당 하위 폴더에서 지난 24시간 동안 수정된 .log 확장자를 가진 파일을 찾습니다. 이 작업은 파일 찾기, 파일 필터링, 결과 인쇄의 세 단계로 구성됩니다. 그리고 파일을 검색하고 파일을 필터링한 후 결과를 분석하세요. 비어 있으면 Phaser에서 이 스레드를 로그오프하세요. 즉, 다음 단계에서는 스레드가 실행에 참여하지 않습니다. run() 메서드에서 페이저의 receiveAndAwaitAdvance() 메서드는 파일 검색을 시작하기 전에 모든 스레드가 시작되는지 확인하기 위해 처음에 호출됩니다. 파일 찾기 단계와 파일 필터 단계 후에 결과가 처리됩니다. 즉, 결과가 비어 있으면 스레드를 제거하고 비어 있지 않으면 다음 단계를 균일하게 실행하기 전에 이 단계의 모든 스레드가 단계를 완료할 때까지 기다립니다. 마지막으로 작업이 실행된 후 Phaser의 모든 스레드가 로그아웃됩니다.
Phaser에는 실제로 활성 상태와 종료 상태라는 두 가지 상태가 있습니다. 동기화에 참여하는 스레드가 있으면 Phaser가 활성화됩니다. 그리고 각 단계가 끝나면 동기화됩니다. 동기화에 참여하는 모든 스레드가 등록 취소되면 Phase는 종료된 상태가 됩니다. 이 상태에서는 Phaser에 작업 참가자가 없습니다.
Phaser의 주요 기능은 다단계 작업을 실행하고 각 단계 지점에서 스레드 동기화를 보장하는 것입니다. 각 단계 지점에서 참가자를 조건화하거나 제거하는 것도 가능합니다. 여기에는 주로 ArrivalAndAwaitAdvance(), Register() 및 ArrivalAndDeregister() 메서드가 포함됩니다.
4) 네트워킹 향상
리소스를 제때에 닫을 수 있는 URLClassLoader 닫기 메서드가 추가되었습니다. 이후에 클래스 파일을 다시 로드해도 리소스 점유나 해제 문제가 발생하지 않습니다.
5) 멀티스레드 사용자 정의 클래스 로더
클래스의 동시 로드로 인해 발생할 수 있는 교착 상태 문제를 해결합니다. 이 문제는 일부 새 버전의 jdk1.6에서 해결되었으며 jdk7에서도 일부 최적화가 이루어졌습니다.
Java1.81. 인터페이스의 기본 메소드
Java1.8 이전에는 인터페이스의 모든 메소드가 추상 메소드여야 했습니다. Java 8에서는 인터페이스에 비추상 메소드 구현을 추가할 수 있습니다. 기본 Just 키워드를 사용하세요.
2. 람다 표현식
이를 통해 함수에 동작을 전달할 수 있습니다. Java 8 이전에는 동작을 함수에 전달하려는 경우 유일한 옵션은 6줄의 코드가 필요한 익명 클래스뿐이었습니다. 동작을 정의하는 가장 중요한 코드 줄은 중간에 묻혀 있어 충분히 눈에 띄지 않습니다. 람다 표현식은 익명 클래스를 대체하여 템플릿을 제거하고 기능적 스타일로 코드를 작성할 수 있도록 합니다. 이는 때때로 더 나은 가독성과 더 명확한 표현을 가져옵니다.
3. 기능적 인터페이스
인터페이스가 고유한 추상 메서드를 정의하면 이 인터페이스는 기능적 인터페이스가 됩니다. 기능적 인터페이스의 매우 중요한 속성은 람다를 사용하여 인스턴스화할 수 있다는 것입니다.
4. 메서드 및 생성자 참조
키워드를 사용하여 메서드 또는 생성자 참조를 전달하세요.
5. 람다 범위
람다 표현식에서 외부 범위에 액세스하는 방법은 이전 버전의 익명 객체와 매우 유사합니다. final로 표시된 외부 지역 변수나 인스턴스 필드 및 정적 변수에 직접 액세스할 수 있습니다.
6. 지역 변수에 액세스
람다 식에서 외부 지역 변수에 직접 액세스할 수 있습니다.
7. 객체 필드 및 정적 변수에 액세스
로컬 변수와 달리 람다의 내부 필드 및 정적 변수는 읽기 및 쓰기가 가능합니다. 이 동작은 익명 개체와 일치합니다.
🎜8. 인터페이스에 액세스하는 기본 방법🎜JDK1.8 API에는 Comparator 또는 Runnable 인터페이스와 같이 이전 Java에서 일반적으로 사용되는 내장 기능 인터페이스가 많이 포함되어 있습니다. 이러한 인터페이스에는 람다와 함께 사용할 수 있도록 주석이 추가되었습니다.
Java 8 API는 작업을 보다 편리하게 만들기 위해 많은 새로운 기능적 인터페이스도 제공합니다. 일부 인터페이스는 Google Guava 라이브러리에서 가져온 것입니다. 이러한 인터페이스에 익숙하더라도 이러한 인터페이스가 람다로 어떻게 확장되는지 확인해야 합니다.
더 많은 관련 기사를 보려면 PHP 중국어 웹사이트를 방문하세요! !
위 내용은 jdk1.7과 jdk1.8의 차이점은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!