Rumah  >  Artikel  >  Java  >  Bagaimanakah kunci pesimis dan kunci optimistik dalam fungsi Java mencapai keselamatan benang?

Bagaimanakah kunci pesimis dan kunci optimistik dalam fungsi Java mencapai keselamatan benang?

WBOY
WBOYasal
2024-05-04 16:51:02549semak imbas

Dua cara untuk mencapai keselamatan benang dalam fungsi Java: kunci pesimis: dapatkan kunci sebelum mengakses data untuk menghalang akses serentak oleh rangkaian lain untuk memastikan konsistensi data. (kata kunci disegerakkan) Penguncian optimistik: Sahkan data pada penghujung urus niaga dan gulung semula urus niaga jika data diubah suai untuk menambah baik keselarasan. (Kelas atom dalam pakej java.util.concurrent.atomic)

Java 函数中的悲观锁与乐观锁如何实现线程安全?

Bagaimana untuk mencapai keselamatan benang antara kunci pesimis dan kunci optimistik dalam fungsi Java?

Keselamatan benang adalah penting untuk persekitaran berbilang benang, memastikan integriti dan konsistensi data apabila data diakses secara serentak. Di Jawa, penguncian pesimis dan penguncian optimistik adalah dua mekanisme utama untuk mencapai keselamatan benang. Di bawah ini kita akan meneroka bagaimana ia dilaksanakan dan memberikan contoh praktikal.

Kunci Pesimis

Kunci pesimis adalah berdasarkan andaian bahawa data mungkin diubah suai oleh rangkaian lain pada bila-bila masa. Oleh itu, ia memperoleh kunci sebaik sahaja ia mengakses data, menghalang benang lain daripada mengakses data sehingga kunci dilepaskan. Kelebihan penguncian pesimis ialah ia dapat memastikan konsistensi data, tetapi kelemahannya ialah ia boleh menyebabkan persaingan kunci dan kebuntuan. Kata kunci

disegerakkan ialah kaedah biasa untuk melaksanakan penguncian pesimis di Jawa. Ia menandakan blok kod sebagai bahagian kritikal, dan hanya benang yang memperoleh kunci boleh memasuki blok kod. synchronized 关键字是 Java 中实现悲观锁的常用方法。它将代码块标记为临界区,只有获取锁的线程才能进入该代码块。

public class Counter {

    private int count;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

乐观锁

乐观锁基于这样的假设:当线程访问数据时,数据不太可能被其他线程修改。它在事务结束时才对数据进行验证,如果数据被修改,则回滚事务。乐观锁的优点是能提高并发性,缺点是如果数据被修改,可能会导致事务失败。

在 Java 中,java.util.concurrent.atomic 包中的原子类可以实现乐观锁。原子类中的操作是原子性的,保证了并发访问数据的正确性。

import java.util.concurrent.atomic.AtomicInteger;

public class Counter {

    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        count.incrementAndGet();
    }

    public int getCount() {
        return count.get();
    }
}

实战案例:多线程银行账户

为了演示悲观锁和乐观锁在实际场景中的应用,我们考虑一个多线程银行账户。

  • 悲观锁实现:
public class BankAccount {

    private int balance;

    public synchronized void withdraw(int amount) {
        if (balance >= amount) {
            balance -= amount;
        }
    }

    public synchronized int getBalance() {
        return balance;
    }
}
  • 乐观锁实现:
import java.util.concurrent.atomic.AtomicInteger;

public class BankAccount {

    private AtomicInteger balance = new AtomicInteger(0);

    public void withdraw(int amount) {
        while (true) {
            int currentBalance = balance.get();
            if (currentBalance >= amount) {
                if (balance.compareAndSet(currentBalance, currentBalance - amount)) {
                    break;
                }
            } else {
                break;
            }
        }
    }

    public int getBalance() {
        return balance.get();
    }
}

使用 optimistic 锁,在取款时,它会获得当前余额,然后尝试使用 compareAndSetrrreee

Penguncian optimistik

Penguncian optimistik adalah berdasarkan andaian bahawa apabila benang mengakses data, data itu tidak mungkin diubah suai oleh utas lain. Ia hanya mengesahkan data pada akhir urus niaga dan melancarkan urus niaga jika data telah diubah suai. Kelebihan penguncian optimistik ialah ia boleh meningkatkan keselarasan, tetapi kelemahannya ialah jika data diubah suai, ia boleh menyebabkan transaksi gagal.

Di Java, kelas atom dalam pakej java.util.concurrent.atomic boleh melaksanakan penguncian optimistik. Operasi dalam kelas atom adalah atom, memastikan ketepatan akses serentak kepada data. 🎜rrreee🎜🎜Kes praktikal: Akaun bank berbilang benang🎜🎜🎜Untuk menunjukkan penerapan penguncian pesimis dan penguncian optimistik dalam senario praktikal, kami menganggap akaun bank berbilang benang. 🎜
  • 🎜Pelaksanaan kunci pesimis: 🎜
rrreee
  • 🎜Pelaksanaan kunci optimistik: 🎜
rrreee🎜Gunakan kunci optimistik, semasa pengeluaran , ia mendapat baki semasa dan kemudian cuba menolak amaun pengeluaran secara atom menggunakan compareAndSet. Jika baki tidak mencukupi, operasi akan gagal dan benang akan mencuba semula. 🎜🎜🎜Pilih kunci pesimis atau kunci optimistik🎜🎜🎜Memilih kunci pesimis atau kunci optimis bergantung pada senario tertentu. Jika akses serentak kepada data jarang berlaku, atau konsistensi data adalah kritikal, penguncian pesimis adalah lebih sesuai. Jika akses serentak kepada data adalah kerap dan ketekalan data membenarkan tahap kompromi tertentu, penguncian optimistik adalah lebih sesuai. 🎜

Atas ialah kandungan terperinci Bagaimanakah kunci pesimis dan kunci optimistik dalam fungsi Java mencapai keselamatan benang?. 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