Rumah  >  Artikel  >  Java  >  Pemahaman mendalam tentang penyegerakan benang dan mekanisme pengecualian bersama dalam pembangunan Java

Pemahaman mendalam tentang penyegerakan benang dan mekanisme pengecualian bersama dalam pembangunan Java

WBOY
WBOYasal
2023-11-20 12:13:15720semak imbas

Pemahaman mendalam tentang penyegerakan benang dan mekanisme pengecualian bersama dalam pembangunan Java

Dalam pembangunan Java, pengaturcaraan berbilang benang telah menjadi situasi yang tidak dapat dielakkan. Multi-threading sudah pasti akan melibatkan penyegerakan benang dan mekanisme pengecualian bersama, jadi sangat penting bagi pengaturcara untuk mempunyai pemahaman yang mendalam tentang penyegerakan benang dan mekanisme pengecualian bersama dalam pembangunan Java.

1. Mekanisme penyegerakan benang

Dalam persekitaran berbilang benang, jika berbilang benang mengakses sumber yang sama pada masa yang sama, masalah persaingan data mungkin berlaku. Masalah perlumbaan data termasuk mengakses pembolehubah yang sama, memanggil kaedah yang sama pada masa yang sama, dsb. Pada masa ini, mekanisme penyegerakan benang diperlukan untuk mengelakkan masalah persaingan data.

Idea asas mekanisme penyegerakan utas ialah: apabila mengakses sumber kongsi, hanya satu utas dibenarkan untuk melaksanakan operasi capaian dan utas lain mesti menunggu operasi capaian semasa tamat sebelum mereka boleh terus mengakses. Di Java, mekanisme penyegerakan benang yang biasa digunakan termasuk kata kunci yang disegerakkan dan antara muka Kunci.

  1. kata kunci disegerakkan

Kata kunci disegerakkan digunakan untuk mengubah suai kaedah atau blok kod Ia boleh mensiri akses berbilang rangkaian kepada sumber kongsi untuk memastikan hanya satu utas mengakses sumber dikongsi pada masa yang sama.

Untuk melaksanakan operasi penyegerakan yang disegerakkan pada kaedah, anda boleh menggunakan dua kaedah berikut:

public class Test {
  // synchronized 修饰方法
  public synchronized void testMethod() {
    // 对共享资源进行访问
  }

  // 在方法内部,使用 synchronized 代码块
  public void testMethod2() {
    synchronized(this){
      // 对共享资源进行访问
    }
  }
}

Untuk objek, kunci disegerakkan dilaksanakan pada bit tanda Mark Word dalam pengepala objek Apabila benang melaksanakan kaedah atau kod yang disegerakkan blok, ia akan Cuba memperoleh kunci objek.

  1. Antara muka kunci

Di Java, antara muka Lock ialah kunci mutex reentrant yang boleh menggantikan kata kunci yang disegerakkan dan menyediakan kawalan penyegerakan yang lebih fleksibel. Antara muka Lock menyediakan dua pelaksanaan: ReentrantLock dan ReentrantReadWriteLock.

public class Test {
  // Lock接口的使用
  private Lock lock = new ReentrantLock();
  
  public void testMethod() {
    lock.lock();
    try {
      //对共享资源进行访问
    } finally {
      lock.unlock();
    }
  }
}

Apabila menggunakan antara muka Kunci, anda perlu menggunakan blok cuba-akhir untuk memastikan kunci dilepaskan dengan melepaskan kunci dalam blok akhirnya memastikan bahawa selepas kunci diperoleh, kunci boleh dilepaskan dengan selamat tidak kira sama ada kaedah dilaksanakan secara normal atau pengecualian dilemparkan.

2. Mekanisme pengecualian bersama benang

Mekanisme pengecualian bersama benang ialah cara untuk melaksanakan penyegerakan benang. Apabila berbilang benang bersaing untuk mengunci objek yang sama, hanya satu utas boleh menduduki kunci itu. Mekanisme pengecualian bersama memastikan bahawa hanya satu utas sedang melaksanakan segmen kod tertentu atau mengakses sumber tertentu pada masa yang sama.

Mekanisme pengecualian bersama benang biasanya dilaksanakan di Jawa melalui kata kunci yang disegerakkan atau antara muka Kunci. Apabila benang memperoleh kunci pada objek, benang lain mesti menunggu benang melepaskan kunci sebelum memperoleh kunci semula.

  1. kata kunci disegerakkan

Kata kunci yang disegerakkan ialah mekanisme pengecualian bersama benang yang paling biasa, yang dilaksanakan dengan mengunci objek yang sama.

public class Test {
  // synchronized 关键字的实现
  public synchronized void testMethod() {
    // 这里是同步代码块
  }
}
  1. Antara muka kunci

Antara muka kunci juga boleh digunakan untuk melaksanakan mekanisme pengecualian bersama benang. Apabila menggunakan antara muka Kunci, anda perlu memanggil kaedah lock() untuk memperoleh kunci, dan memanggil kaedah buka kunci() apabila melepaskan kunci.

public class Test {
  // Lock 接口的实现
  private Lock lock = new ReentrantLock();
  public void testMethod() {
    lock.lock();
    try {
      // 这里是同步代码块
    } finally {
      lock.unlock();
    }
  }
}

3 Ringkasan

Dalam pembangunan Java, pengaturcaraan berbilang benang adalah perkara biasa. Penyegerakan benang dan mekanisme pengecualian bersama memastikan ketepatan dan keselamatan program, tetapi terdapat juga beberapa isu prestasi. Apabila membangunkan program, anda perlu menimbang faedah dan kos menggunakan mekanisme penyegerakan dan pengecualian bersama.

Atas ialah kandungan terperinci Pemahaman mendalam tentang penyegerakan benang dan mekanisme pengecualian bersama dalam pembangunan Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn