CodeGym/Khóa học Java/Mô-đun 3/Bộ đồng bộ hóa: Đồng bộ hóa quyền truy cập vào tài nguyên...

Bộ đồng bộ hóa: Đồng bộ hóa quyền truy cập vào tài nguyên trong Java

Có sẵn

đèn hiệu

Semaphores thường được sử dụng khi cần giới hạn số luồng khi làm việc với hệ thống tệp. Quyền truy cập vào tệp hoặc tài nguyên được chia sẻ khác được kiểm soát thông qua bộ đếm. Nếu giá trị của nó lớn hơn 0, quyền truy cập được phép, nhưng đồng thời bộ đếm sẽ giảm.

Tại thời điểm bộ đếm trả về 0, luồng hiện tại sẽ bị chặn cho đến khi tài nguyên được giải phóng bởi luồng khác. Số lượng tham số quyền phải được đặt thông qua hàm tạo.

Bạn cần chọn riêng tham số này, tùy thuộc vào sức mạnh của máy tính hoặc máy tính xách tay của bạn.

public class Main {

   public static void main(String[] args) {
       Semaphore sem = new Semaphore(1);
       CommonResource res = new CommonResource();
       new Thread(new MyThread(res, sem, "MyThread_1")).start();
       new Thread(new MyThread(res, sem, "MyThread_2")).start();
       new Thread(new MyThread(res, sem, "MyThread_3")).start();
   }
}

class CommonResource {
   int value = 0;
}

class MyThread implements Runnable {
   CommonResource commonResource;
   Semaphore semaphore;
   String name;
   MyThread(CommonResource commonResource, Semaphore sem, String name) {
       this.commonResource = commonResource;
       this.semaphore = sem;
       this.name = name;
   }

   public void run() {

       try {
           System.out.println(name + "waiting permission");
           semaphore.acquire();
           commonResource.value = 1;
           for (int i = 1; i < 7; i++) {
               System.out.println(this.name + ": " + commonResource.value);
               commonResource.value++;
               Thread.sleep(150);
           }
       } catch (InterruptedException e) {
           System.out.println(e.getMessage() + " " + name);
           Thread.currentThread().interrupt();
       }
       System.out.println(name + "releases permission");
       semaphore.release();
   }
}

CountDownLatch và những người khác

CountDownLatch - Cho phép nhiều luồng đợi cho đến khi hoàn thành một số thao tác nhất định được thực hiện trên các luồng khác. Một ví dụ là cài đặt ứng dụng: nó sẽ không bắt đầu cho đến khi bạn chấp nhận các điều khoản sử dụng, cho đến khi bạn chọn một thư mục để cài đặt chương trình mới, v.v. Có một phương thức countDown() đặc biệt cho việc này - phương thức này giảm bộ đếm ngược xuống một đơn vị.

Ngay khi số đếm về 0, tất cả các chuỗi đang chờ trong phần chờ đợi sẽ tiếp tục công việc của chúng và tất cả các lệnh gọi tiếp theo của phần chờ đợi sẽ trôi qua mà không cần chờ đợi. Bộ đếm ngược là bộ đếm một lần và không thể đặt lại.

CyclicBarrier - được sử dụng để đồng bộ hóa một số luồng nhất định tại một thời điểm. Rào cản đạt được khi N luồng gọi phương thức và khối đang chờ (...) . Sau đó, bộ đếm được đặt lại về giá trị ban đầu và các luồng đang chờ sẽ được giải phóng. Ngoài ra, nếu cần, có thể chạy mã tùy chỉnh trước khi bỏ chặn chuỗi và đặt lại bộ đếm. Để làm điều này, một đối tượng có triển khai giao diện Runnable được chuyển qua hàm tạo .

Exchanger<V> lớp Exchanger dành cho việc trao đổi dữ liệu giữa các luồng. Nó được gõ và gõ kiểu dữ liệu mà các luồng cần trao đổi.

Dữ liệu được trao đổi bằng phương thức exchange() duy nhất của lớp này :

V exchange(V x) throws InterruptedException
V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException

Tham số x đại diện cho bộ đệm dữ liệu sẽ được trao đổi. Dạng thứ hai của phương thức cũng xác định tham số thời gian chờ , thời gian chờ và đơn vị , loại đơn vị thời gian sẽ sử dụng cho tham số thời gian chờ .

Lớp Phaser cho phép bạn đồng bộ hóa các luồng đại diện cho một giai đoạn hoặc một giai đoạn trong quá trình thực hiện một hành động tổng thể. Phaser định nghĩa một đối tượng đồng bộ hóa đợi cho đến khi một giai đoạn nhất định hoàn thành. Sau đó, Phaser chuyển sang giai đoạn hoặc giai đoạn tiếp theo và đợi nó hoàn thành lại.

Khi làm việc với lớp Phaser , thông thường trước tiên bạn phải tạo đối tượng của nó. Tiếp theo, chúng ta cần đăng ký tất cả những người tham gia. Để đăng ký cho mỗi người tham gia, phương thức register() được gọi hoặc bạn có thể thực hiện mà không cần phương thức này bằng cách chuyển số lượng người tham gia cần thiết cho hàm tạo Phaser .

Sau đó, mỗi người tham gia thực hiện một tập hợp các hành động nhất định tạo nên giai đoạn. Và bộ đồng bộ Phaser đợi cho đến khi tất cả những người tham gia hoàn thành việc thực hiện phase. Để thông báo cho bộ đồng bộ hóa rằng giai đoạn đã kết thúc, người tham gia phải gọi phương thức đến() hoặc đếnAndAwaitAdvance() . Bộ đồng bộ hóa sau đó chuyển sang giai đoạn tiếp theo.

1
Nhiệm vụ
Mô-đun 3,  mức độbài học
Đã khóa
Arbeiten!
task4207
Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào