CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN này có giải thích chi tiết về từ khóa được đồng bộ hóa trong Java được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm đến bài viết này thì nhớ like nhé.
Trong lập trình đồng thời, từ khóa được đồng bộ hóa là một vai trò phổ biến. Chúng tôi thường gọi khóa trọng lượng từ khóa được đồng bộ hóa, nhưng trong jdk1.6, đồng bộ hóa đã được tối ưu hóa và các khóa thiên vị cũng như khóa nhẹ đã được giới thiệu. Bài viết này giới thiệu cách sử dụng từ khóa được đồng bộ hóa, sự khác biệt và nguyên tắc triển khai của khóa thiên vị, khóa nhẹ và khóa nặng.
Trước tiên chúng ta hãy xem 4 cách sử dụng của từ khóa được đồng bộ hóa.
1. Sửa đổi các phương pháp phổ biến.
?
1
2
3
|
riêng tư
đồng bộ
vô hiệu
phương pháp đồng bộ(){
}
|
Trong cách sử dụng này, phiên bản đối tượng của khóa được đồng bộ hóa.
2. Sửa đổi các phương thức tĩnh.
?
1
2
3
|
riêng tư
tĩnh
đồng bộ
vô hiệu
phương pháp đồng bộ(){
}
|
được đồng bộ hóa Trong trường hợp này, khóa là đối tượng lớp hiện tại.
3. Khối phương thức đồng bộ.
?
1
2
3
4
5
6
7
8
9
10
|
riêng tư
vô hiệu
phương pháp đồng bộ1(){
đồng bộ
(
cái này
){
}
}
riêng tư
vô hiệu
phương pháp đồng bộ2(){
đồng bộ
(kiểm tra luồng.
lớp học
){
}
}
|
Đối tượng khóa trong synmethod1; đối tượng khóa trong synmethod2 là đối tượng lớp hiện tại.
Hãy giới thiệu lại nguyên tắc khóa.
Trước khi giới thiệu nguyên tắc khóa, trước tiên chúng ta hãy tìm hiểu từ đánh dấu tiêu đề đối tượng Java, lấy 32 bit làm ví dụ.
。
trạng thái khóa. |
25 bit 。 |
4bit 。 |
1 bit 。 |
2bit。 |
|
23bit。 |
2bit。 |
Có nên thiên vị khóa hay không. |
Cờ khóa. |
Khóa nhẹ. |
Con trỏ tới bản ghi khóa trên ngăn xếp. |
0 。 |
Khóa nặng. |
Con trỏ tới một mutex (khóa hạng nặng). |
10 。 |
dấu gc. |
vô giá trị. |
11 。 |
Khóa thiên vị. |
Id chủ đề. |
thời đại 。 |
Độ tuổi tạo đối tượng. |
1 。 |
01 。 |
Không có khóa. |
Mã băm của đối tượng. |
Độ tuổi tạo đối tượng. |
0 。 |
01 。 |
。
Bảng trên mô tả thông tin được lưu trữ trong tiêu đề đối tượng khi đối tượng ở mỗi trạng thái khóa.
1. Khóa thiên vị.
Trong môi trường thực tế, khi một luồng truy cập vào một khối được đồng bộ hóa, nếu không có luồng nào khác cạnh tranh khóa và cùng một luồng đó nhận được khóa nhiều lần, nghĩa là một luồng đơn sẽ chạy mã đồng bộ hóa. bị chặn mỗi lần, điều đó có nghĩa là lãng phí hiệu suất của CPU. Trong trường hợp này, khái niệm khóa thiên vị được đưa ra.

- Truy cập các khối mã được đồng bộ hóa
- Xác định xem id luồng được lưu trong từ đánh dấu của tiêu đề đối tượng có trỏ đến luồng hiện tại hay không. Nếu vậy, nó cho biết rằng khóa hiện tại đã được cấp lại. Không cần phải lấy khóa và thực thi trực tiếp mã đồng bộ hóa.
- Nếu không, hãy thử sử dụng thuật toán cas để cập nhật id luồng vào tiêu đề đối tượng.
- Thành công, khóa được lấy và mã đồng bộ hóa được thực thi. Việc không cập nhật cho biết có sự cạnh tranh về khóa. Đợi điểm an toàn toàn cầu, tạm dừng chuỗi sở hữu khóa thiên vị và chọn nâng cấp khóa thiên vị thành khóa nhẹ hoặc đặt thành không khóa theo cờ khóa trong tiêu đề đối tượng.
Bạn có thể sử dụng -xx:-userbiasedlocking=false để tắt tối ưu hóa khóa thiên vị jvm và nhập trực tiếp khóa nhẹ theo mặc định.
2. Khóa nhẹ.

Khi truy cập khối mã được đồng bộ hóa, vùng bản ghi khóa trước tiên được tạo trong ngăn xếp luồng của luồng hiện tại.
Sao chép từ đánh dấu tiêu đề đối tượng vào bản ghi khóa.
Sử dụng cas để cố gắng cập nhật con trỏ luồng trong từ đánh dấu tiêu đề đối tượng thành con trỏ tới luồng hiện tại.
Nếu cập nhật thành công, bạn sẽ nhận được một khóa nhẹ.
Cập nhật không thành công, hãy kiểm tra xem con trỏ trong từ đánh dấu có trỏ đến chuỗi hiện tại hay không.
Nếu đúng thì có nghĩa là khóa đã được cài lại. Thực thi các khối mã được đồng bộ hóa.
Nếu không thì có sự cạnh tranh. Cần phải mở rộng khóa nhẹ thành khóa trọng lượng.
3. Khóa trọng lượng.
Khóa trọng lượng được thực hiện dựa trên màn hình đối tượng (monitor).

Khi một luồng thực thi mã đồng bộ hóa, nó cần gọi lệnh Monitor.enter. Sau khi thoát khỏi quá trình thực thi, hãy gọi lệnh Monitor.exit. Có thể thấy ở đây rằng màn hình là độc quyền tại một thời điểm chỉ có thể nhập thành công một luồng và các luồng khác chỉ có thể bị chặn trong hàng đợi. Vì vậy chi phí vận hành loại khóa trọng lượng này cao.
Trên đây là giải thích chi tiết và tích hợp từ khóa được đồng bộ hóa trong Java được trình soạn thảo giới thiệu. Tôi hy vọng nó sẽ hữu ích cho bạn. Nếu có thắc mắc gì, vui lòng để lại tin nhắn cho tôi và trình soạn thảo sẽ trả lời bạn kịp thời. Tôi cũng xin cảm ơn mọi người đã ủng hộ trang web của tôi! .
Liên kết gốc: https://www.cnblogs.com/sunshine-ground-poems/p/10317381.html
Cuối cùng, bài viết này về giải thích chi tiết về từ khóa được đồng bộ hóa trong Java kết thúc tại đây. Nếu bạn muốn biết thêm về giải thích chi tiết về từ khóa được đồng bộ hóa trong Java, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục duyệt qua các bài viết liên quan. hỗ trợ nó trong tương lai blog của tôi! .
Tôi là một lập trình viên xuất sắc, rất giỏi!