Semaphore trong Java là gì và công dụng của nó?



Một semaphore được sử dụng để đồng bộ hóa các quy trình. Trên blog này sẽ hướng dẫn bạn các kiểu khác nhau và cách triển khai các semaphores trong java.

Một Semaphore ở kiểm soát quyền truy cập vào tài nguyên được chia sẻ thông qua bộ đếm. Nó là một đồng bộ hóa luồng cấu trúc được sử dụng để gửi tín hiệu giữa các luồng để tránh các tín hiệu bị bỏ lỡ hoặc bảo vệ một phần quan trọng. Trong blog này về Semaphores bằng Java, chúng ta sẽ hiểu khái niệm này một cách chi tiết.
Các chủ đề sau sẽ được đề cập trong blog này:

Semaphore trong Java là gì?

Semaphore là một biến được sử dụng để đồng bộ hóa các quy trình được sử dụng để quản lý các quy trình đồng thời. Nó cũng được sử dụng để kiểm soát quyền truy cập vào một tài nguyên chung của nhiều quá trình đồng thời và tránh tình trạng chạy đua.





Các loại semaphore -

  • Semaphore nhị phân: Một semaphore nhị phân chỉ nhận các giá trị 0 và 1 và được sử dụng để thực hiện loại trừ lẫn nhau cũng như đồng bộ hóa các quá trình đồng thời.

    java cách sử dụng trình lặp
  • Đếm semaphore: Giá trị của một semaphore đang đếm tại bất kỳ thời điểm nào cho biết số lượng tối đa các quy trình có thể đi vào phần quan trọng cùng một lúc.



    java lấy ngày từ chuỗi

Hoạt động của Semaphore

  • Nếu số lượng semaphore> 0, chuỗi sẽ nhận được giấy phép, làm giảm số lượng semaphore.

  • Khác, bị chặn cho đến khi có được giấy phép.

  • Khi luồng không còn cần quyền truy cập vào tài nguyên được chia sẻ, nó sẽ giải phóng giấy phép, tăng số lượng semaphore.



  • Nếu một luồng khác đang chờ giấy phép, thì luồng đó sẽ nhận được giấy phép tại thời điểm đó.

    khi nào sử dụng cái này. trong java

Thực hiện Semaphore

import java.util.concurrent. * // Sẽ lấy Resource làm lớp chia sẻ lớp Resource {static int count = 0} lớp MyDemo mở rộng Demo {Semaphore sem String threadName public MyDemo (Semaphore sem, String threadName) {super (threadName) this. sem = sem this.threadName = threadName} @Override public void run () {// Chạy theo X if (this.getName (). equals ('X')) {System.out.println ('Đang bắt đầu' + threadName) try {// Sẽ nhận được giấy phép để truy cập tài nguyên được chia sẻ System.out.println (threadName + 'đang chờ giấy phép.') // lấy được khóa sem.acquire () System.out.println (threadName + 'nhận được giấy phép . ') // Bây giờ, việc truy cập tài nguyên được chia sẻ và phần còn lại sẽ đợi (int i = 0 i<7 i++) { Resource.count++ System.out.println(threadName + ': ' + Resouce.count) // Now thread Y will try to execute Thread.sleep(20) } } catch (InterruptedException exc) { System.out.println(exc) } // Release the permit. System.out.println(threadName + ' releases the permit.') sem.release() } // run by thread Y else { System.out.println('Starting ' + threadName) try { // First, Y will try to get permit System.out.println(threadName + ' waiting for a permit.') // acquiring the lock sem.acquire() System.out.println(threadName + ' gets a permit.') // Now, accessing the shared resource and others will wait for(int i=0 i < 7 i++) { Resource.count-- System.out.println(threadName + ': ' + Resource.count) // Now, allowing a context switch -- if possible. // for thread X to execute Thread.sleep(20) } } catch (InterruptedException exc) { System.out.println(exc) } // Release the permit. System.out.println(threadName + ' releases the permit.') sem.release() } } } public class SemTest { public static void main(String args[]) throws InterruptedException { // creating a Semaphore object // with number of permits 1 Semaphore sem = new Semaphore(1) // creating two threads with name X and Y // Here thread X will increment and Y will decrement the counter MyDemo md1 = new MyDemo(sem, 'X') MyDemo md2 = new MyDemo(sem, 'Y') // stating threads X and Y md1.start() md2.start() // waiting for threads X and Y md1.join() mtd.join() System.out.println('count: ' + Resource.count) } } 

Đầu ra-
Bắt đầu X
Bắt đầu Y
X đang chờ giấy phép
Y đang chờ giấy phép
X: 1
X: 2
X: 3
X: 4
X: 5
X: 6
X: 7
X phát hành giấy phép
Y nhận được giấy phép
Y: 6
Y: 5
Y: 4
Y: 3
Y: 2
Y: 1
Y: 0
Và giấy phép phát hành
đếm: 0

Với điều này, chúng ta sẽ kết thúc blog này về “Semaphores in Java”. Nếu bạn muốn tìm hiểu thêm về Java, hãy xem của Edureka, một công ty học trực tuyến đáng tin cậy với mạng lưới hơn 250.000 người học hài lòng trải dài trên toàn cầu. Khóa đào tạo và cấp chứng chỉ về Java J2EE và SOA của Edureka được thiết kế cho sinh viên và các chuyên gia muốn trở thành Nhà phát triển Java. Khóa học được thiết kế để cung cấp cho bạn khởi đầu về lập trình Java và đào tạo bạn về cả khái niệm Java cốt lõi và nâng cao cùng với các khung Java khác nhau như Hibernate & Spring.

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến vấn đề này trong phần nhận xét của blog “Semaphore trong Java” này và chúng tôi sẽ liên hệ lại với bạn trong thời gian sớm nhất.