Rumah pembangunan bahagian belakang tutorial php 使用synchronized实现一个Lock代码详解

使用synchronized实现一个Lock代码详解

Dec 20, 2017 am 11:56 AM
lock synchronized

本文给大家介绍了如何使用synchronized实现一个Lock代码,下面是实战案例,需要的朋友可以参考借鉴一下。

方式一:

public synchronized void a(){
  //TODO
}
Salin selepas log masuk


方式二:

public void b(){
  synchronized(this){
    //TODO
  }
}
Salin selepas log masuk


从这两种方式来看,锁都是加在{}之间的,我们再来看看Lock是如何做的呢:

public void c() {
  lock.lock();
  try {
    // TODO
  } finally {
    lock.unlock();
  }
}
Salin selepas log masuk


这种方式的锁是加在lock()和unlock()之间的,所以要想实现一个lock功能,就要想怎么实现这样两个方法,lock()和unlock()方法,先定义一个框架如下所示:

public void lock(){
}
public void unlock(){
}
Salin selepas log masuk


然后要想怎么用synchronized去实现这两个方法。

现在其实只是稍微清楚了一点思路,但是还不知道怎么去填充这两个方法,这是后再来分析一下Lock的加锁有什么特点,再来看看这段代码:

public void c() {
    lock.lock();
    //When current thread get the lock, other thread has to wait
    try {
        //current thread get in the lock, other thread can not get in
        // TODO
    }
    finally {
        lock.unlock();
        //current thread release the lock
    }
}
Salin selepas log masuk


这段代码我只是加了一点注释,别的什么都没有做,是不是帮助理解这段代码,看看出现频率最高的词是什么,是currentthread,那么我们去填充lock()和unlock()方法的时候是不是注意要抓住currentthread这个关键字就可以找到解决方案呢?答案是肯定的。

接着分析,使用synchronized的时候如何让线程等待呢?是用wait()方法。怎么让线程唤醒呢,是用notify()方法。那么就要在lock()方法中使用wait()方法,在unlock()方法中使用notify()方法。那么我们在使用wait()和notify()的时候是有一个条件的,想想我们应该使用什么作为条件呢?

我们应该使用当前锁是否被占用作为判断条件,如果锁被占用,currentthread等待,想想我们在使用synchronized的时候是不是一直使用的这个条件,答案也是肯定的。

再来分析一下什么时候释放锁,使用什么作为条件,想想如果线程A拿到了锁,线程B能释放吗?当然不能,如果B能释放就违反了原则,当然不能。肯定是A线程的锁只能A来释放。所以判断条件就是判断持有锁的线程是不是currentthread,如果是的话,可以释放,不是的话当然不能。

现在来看看完整的代码:

package test.lock;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
public class NaiveLock {
    private static final long NONE = -1;
    private long owner = NONE;
    private Boolean isLooked() {
        return owner != NONE;
    }
    public synchronized void lock() {
        long currentThreadId = Thread.currentThread().getId();
        if (owner == currentThreadId) {
            throw new IllegalStateException("Lock has been acquired by current thread");
        }
        while (this.isLooked()) {
            System.out.println(String.format("thread %s is waitting lock", currentThreadId));
            try {
                wait();
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        owner = currentThreadId;
        System.out.println(String.format("Lock is acquired by thread %s", owner));
    }
    public synchronized void unlock() {
        if (!this.isLooked() || owner != Thread.currentThread().getId()) {
            throw new IllegalStateException("Only Lock owner can unlock the lock");
        }
        System.out.println(String.format("thread %s is unlocking", owner));
        System.out.println();
        owner = NONE;
        notify();
    }
    public static void main(String[] args) {
        final NaiveLock lock = new NaiveLock();
        ExecutorService executor = Executors.newFixedThreadPool(20, new ThreadFactory() {
            private ThreadGroup group = new ThreadGroup("test thread group");
            {
                group.setDaemon(true);
            }
            @Override
                  public Thread newThread(Runnable r) {
                return new Thread(group, r);
            }
        }
        );
        for (int i = 0; i < 20; i++) {
            executor.submit(new Runnable() {
                @Override
                        public void run() {
                    lock.lock();
                    System.out.println(String.format("thread %s is running...", Thread.currentThread().getId()));
                    try {
                        Thread.sleep(new Random().nextint(1000));
                    }
                    catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    lock.unlock();
                }
            }
            );
        }
    }
}
Salin selepas log masuk


运行一下看看结果:

Lock is acquired by thread 8
thread 8 is running...
thread 27 is waitting lock
thread 26 is waitting lock
thread 25 is waitting lock
thread 24 is waitting lock
thread 23 is waitting lock
thread 22 is waitting lock
thread 21 is waitting lock
thread 20 is waitting lock
thread 19 is waitting lock
thread 18 is waitting lock
thread 17 is waitting lock
thread 16 is waitting lock
thread 15 is waitting lock
thread 14 is waitting lock
thread 13 is waitting lock
thread 12 is waitting lock
thread 11 is waitting lock
thread 10 is waitting lock
thread 9 is waitting lock
thread 8 is unlocking
  
Lock is acquired by thread 27
thread 27 is running...
thread 27 is unlocking
  
Lock is acquired by thread 26
thread 26 is running...
thread 26 is unlocking
  
Lock is acquired by thread 25
thread 25 is running...
thread 25 is unlocking
  
Lock is acquired by thread 24
thread 24 is running...
thread 24 is unlocking
  
Lock is acquired by thread 23
thread 23 is running...
thread 23 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 22 is unlocking
  
Lock is acquired by thread 21
thread 21 is running...
thread 21 is unlocking
  
Lock is acquired by thread 20
thread 20 is running...
thread 20 is unlocking
  
Lock is acquired by thread 19
thread 19 is running...
thread 19 is unlocking
  
Lock is acquired by thread 18
thread 18 is running...
thread 18 is unlocking
  
Lock is acquired by thread 17
thread 17 is running...
thread 17 is unlocking
  
Lock is acquired by thread 16
thread 16 is running...
thread 16 is unlocking
  
Lock is acquired by thread 15
thread 15 is running...
thread 15 is unlocking
  
Lock is acquired by thread 14
thread 14 is running...
thread 14 is unlocking
  
Lock is acquired by thread 13
thread 13 is running...
thread 13 is unlocking
  
Lock is acquired by thread 12
thread 12 is running...
thread 12 is unlocking
  
Lock is acquired by thread 11
thread 11 is running...
thread 11 is unlocking
  
Lock is acquired by thread 10
thread 10 is running...
thread 10 is unlocking
  
Lock is acquired by thread 9
thread 9 is running...
thread 9 is unlocking
Salin selepas log masuk


如果把for循环改成30次,再看一下结果:

Lock is acquired by thread 8
thread 8 is running...
thread 27 is waitting lock
thread 26 is waitting lock
thread 25 is waitting lock
thread 24 is waitting lock
thread 23 is waitting lock
thread 22 is waitting lock
thread 21 is waitting lock
thread 20 is waitting lock
thread 19 is waitting lock
thread 18 is waitting lock
thread 17 is waitting lock
thread 16 is waitting lock
thread 15 is waitting lock
thread 14 is waitting lock
thread 13 is waitting lock
thread 12 is waitting lock
thread 11 is waitting lock
thread 10 is waitting lock
thread 9 is waitting lock
thread 8 is unlocking
  
Lock is acquired by thread 27
thread 27 is running...
thread 8 is waitting lock
thread 27 is unlocking
  
Lock is acquired by thread 27
thread 27 is running...
thread 26 is waitting lock
thread 27 is unlocking
  
Lock is acquired by thread 27
thread 27 is running...
thread 25 is waitting lock
thread 27 is unlocking
  
Lock is acquired by thread 24
thread 24 is running...
thread 27 is waitting lock
thread 24 is unlocking
  
Lock is acquired by thread 23
thread 23 is running...
thread 24 is waitting lock
thread 23 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 23 is waitting lock
thread 22 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 21 is waitting lock
thread 22 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 20 is waitting lock
thread 22 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 19 is waitting lock
thread 22 is unlocking
  
Lock is acquired by thread 22
thread 22 is running...
thread 18 is waitting lock
thread 22 is unlocking
  
Lock is acquired by thread 17
thread 17 is running...
thread 17 is unlocking
  
Lock is acquired by thread 16
thread 16 is running...
thread 16 is unlocking
  
Lock is acquired by thread 15
thread 15 is running...
thread 15 is unlocking
  
Lock is acquired by thread 14
thread 14 is running...
thread 14 is unlocking
  
Lock is acquired by thread 13
thread 13 is running...
thread 13 is unlocking
  
Lock is acquired by thread 12
thread 12 is running...
thread 12 is unlocking
  
Lock is acquired by thread 11
thread 11 is running...
thread 11 is unlocking
  
Lock is acquired by thread 10
thread 10 is running...
thread 10 is unlocking
  
Lock is acquired by thread 9
thread 9 is running...
thread 9 is unlocking
  
Lock is acquired by thread 8
thread 8 is running...
thread 8 is unlocking
  
Lock is acquired by thread 26
thread 26 is running...
thread 26 is unlocking
  
Lock is acquired by thread 25
thread 25 is running...
thread 25 is unlocking
  
Lock is acquired by thread 27
thread 27 is running...
thread 27 is unlocking
  
Lock is acquired by thread 24
thread 24 is running...
thread 24 is unlocking
  
Lock is acquired by thread 23
thread 23 is running...
thread 23 is unlocking
  
Lock is acquired by thread 21
thread 21 is running...
thread 21 is unlocking
  
Lock is acquired by thread 20
thread 20 is running...
thread 20 is unlocking
  
Lock is acquired by thread 19
thread 19 is running...
thread 19 is unlocking
  
Lock is acquired by thread 18
thread 18 is running...
thread 18 is unlocking
Salin selepas log masuk


相信看了这些案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

相关阅读:

php如何实现栈数据结构以及括号匹配算法的代码示例详解

php中最简单的字符串匹配算法,php匹配算法_PHP教程

最简单的php中字符串匹配算法教程

Atas ialah kandungan terperinci 使用synchronized实现一个Lock代码详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara menggunakan Lock dalam Java multithreading Cara menggunakan Lock dalam Java multithreading May 12, 2023 pm 02:46 PM

Selepas Jdk1.5, di bawah pakej java.util.concurrent.locks, terdapat satu set antara muka dan kelas yang melaksanakan penyegerakan benang Apabila ia datang kepada penyegerakan benang, semua orang mungkin memikirkan kata kunci yang disegerakkan, iaitu terbina dalam kata kunci dalam Java. Ia mengendalikan penyegerakan benang, tetapi kata kunci ini mempunyai banyak kelemahan dan tidak begitu mudah dan intuitif untuk digunakan, jadi Lock muncul di bawah, kami akan membandingkan dan menerangkan Lock. Biasanya apabila kita menggunakan kata kunci yang disegerakkan, kita akan menghadapi masalah berikut: (1) Tidak dapat dikawal, tidak dapat mengunci dan melepaskan kunci sesuka hati. (2) Kecekapan agak rendah Sebagai contoh, kami sedang membaca dua fail serentak.

Prinsip dan senario penggunaan Disegerakkan dalam Java dan analisis penggunaan dan perbezaan antara muka Boleh Panggil Prinsip dan senario penggunaan Disegerakkan dalam Java dan analisis penggunaan dan perbezaan antara muka Boleh Panggil Apr 21, 2023 am 08:04 AM

1. Ciri asas 1. Ia bermula dengan kunci optimistik, dan jika konflik kunci kerap berlaku, ia ditukar kepada kunci pesimis 2. Ia bermula dengan pelaksanaan kunci ringan, dan jika kunci itu dipegang untuk masa yang lama, ia ditukar kepada kunci heavyweight 3. Strategi kunci putaran yang paling mungkin digunakan semasa melaksanakan kunci ringan 4. Ia adalah kunci tidak adil 5. Ia adalah kunci masuk semula 6. Ia bukan kunci baca-tulis 2. JVM akan menyegerakkan proses penguncian Kunci dibahagikan kepada tiada kunci, kunci berat sebelah, kunci ringan dan keadaan kunci berat. Ia akan dinaik taraf secara berurutan mengikut situasi. Kunci berat sebelah menganggap bahawa protagonis lelaki adalah kunci dan protagonis wanita adalah benang Jika hanya benang ini menggunakan kunci ini, maka protagonis lelaki dan protagonis wanita boleh hidup bahagia selama-lamanya walaupun mereka tidak mendapat sijil nikah (mengelakkan tinggi. -operasi kos). Tetapi peranan sokongan wanita muncul

Apakah cara untuk menggunakan Lock dalam Java? Apakah cara untuk menggunakan Lock dalam Java? Apr 23, 2023 pm 08:52 PM

1. Fungsi (1) Kaedah Kunci untuk memperoleh kunci menyokong gangguan, tiada pemerolehan selepas tamat masa, dan tidak menyekat (2) Ia meningkatkan semantik di mana untuk mengunci dan membuka kunci mesti ditulis keluar (3) Mengunci kunci eksplisit boleh membawa kita Didatangkan dengan fleksibiliti yang baik, tetapi pada masa yang sama kita mesti melepaskan kunci secara manual (4) Objek keadaan Sokongan (5) Benarkan beberapa utas bacaan untuk mengakses sumber yang dikongsi pada masa yang sama 2. penggunaan kunci //Dapatkan kunci voidlock() //Jika utas semasa tidak Jika terganggu, dapatkan kunci voidlockInterruptibly()//Kembalikan kejadian Keadaan baharu yang terikat pada contoh Kunci ini ConditionnewCondition()//Kunci hanya apabila dipanggil

Apakah fungsi yang disediakan oleh kelas Java Lock? Apakah fungsi yang disediakan oleh kelas Java Lock? Apr 21, 2023 am 08:16 AM

Nota 1. Kunci ialah antara muka di bawah pakej java.util.concurent, yang mentakrifkan satu siri kaedah operasi mengunci. 2. Antara muka Lock terutamanya termasuk kelas pelaksanaan ReentrantLock, ReentrantReadWriteLock, ReentrantReadWriteLock dan WriteLock. Berbeza daripada Disegerakkan, Lock menyediakan antara muka yang berkaitan seperti memperoleh kunci dan melepaskan kunci, menjadikannya lebih fleksibel untuk digunakan dan lebih kompleks untuk dikendalikan. InstanceReentrantReadWriteLocklock=newReentrantReadWriteLock();Lockread

Kata kunci Java disegerakkan prinsip dan analisis contoh status kunci Kata kunci Java disegerakkan prinsip dan analisis contoh status kunci May 11, 2023 pm 03:25 PM

1. Konsep kunci dalam Java Spin lock: Apabila benang memperoleh kunci, jika kunci telah diperoleh oleh benang lain, maka benang akan menunggu dalam satu gelung, dan kemudian terus menilai sama ada kunci itu boleh berjaya diperolehi sehingga ia diperolehi. Kunci akan keluar dari gelung. Penguncian optimistik: Dengan mengandaikan tiada konflik, jika data didapati tidak konsisten dengan data yang diperoleh sebelum ini semasa mengubah suai data, data terkini akan dibaca dan pengubahsuaian akan dicuba semula. Kunci pesimis: Andaikan bahawa konflik serentak akan berlaku, segerakkan semua operasi berkaitan data dan mula mengunci dari masa data dibaca. Kunci eksklusif (tulis): Tambahkan kunci tulis pada sumber Utas boleh mengubah suai sumber, tetapi utas lain tidak boleh menguncinya semula (tulisan tunggal). Kunci kongsi (baca): Selepas menambah kunci baca pada sumber, ia hanya boleh dibaca tetapi tidak diubah suai benang lain hanya boleh menambah kunci baca dan tidak boleh menambah kunci tulis (berbilang). Lihat sebagai S

Bagaimana untuk menggunakan disegerakkan untuk melaksanakan mekanisme penyegerakan di Java? Bagaimana untuk menggunakan disegerakkan untuk melaksanakan mekanisme penyegerakan di Java? Apr 22, 2023 pm 02:46 PM

Ringkasan cara menggunakan disegerakkan dalam Java 1. Apabila disegerakkan digunakan sebagai pengubah suai fungsi, kod sampel adalah seperti berikut: Publicsynchronizedvoidmethod(){//….} Ini ialah kaedah penyegerakan Jadi objek yang manakah disegerakkan pada masa ini? Apa yang dia kunci ialah memanggil objek kaedah disegerakkan ini. Dalam erti kata lain, apabila objek P1 melaksanakan kaedah penyegerakan ini dalam urutan yang berbeza, mereka akan membentuk pengecualian bersama untuk mencapai kesan penyegerakan. Walau bagaimanapun, objek lain P2 yang dijana oleh Kelas yang mempunyai objek ini boleh sewenang-wenangnya memanggil kaedah ini dengan kata kunci yang disegerakkan ditambah. Kod sampel di atas, dsb.

Apakah tiga kaedah penyegerakan dalam Java dan cara menggunakannya? Apakah tiga kaedah penyegerakan dalam Java dan cara menggunakannya? Apr 27, 2023 am 09:34 AM

1. Jelaskan bahawa disegerakkan ialah kaedah penyegerakan kami yang paling biasa digunakan, dan terdapat tiga cara utama untuk menggunakannya. 2. Contoh//Penyegerakan kaedah kelas umum synchronizedpublidvoidinvoke(){}//Penyegerakan kaedah statik kelas synchronizedpublicstaticvoidinvoke(){}//Penyegerakan blok kod disegerakkan(objek){}Perbezaan antara ketiga-tiga kaedah ini ialah objek yang disegerakkan adalah berbeza. Kelas biasa menyegerakkan objek itu sendiri, kaedah statik menyegerakkan Kelas itu sendiri, dan blok kod menyegerakkan objek yang kita isi dalam kurungan. Apakah koleksi yang terdapat di Jawa?

Apakah prinsip dan proses peningkatan kunci Java Synchronized? Apakah prinsip dan proses peningkatan kunci Java Synchronized? Apr 19, 2023 pm 10:22 PM

Penyediaan alat Sebelum kita bercakap secara rasmi tentang prinsip disegerakkan, mari kita bercakap tentang kunci putaran dahulu, kerana kunci putaran memainkan peranan yang besar dalam pengoptimuman penyegerakan. Untuk memahami kunci putaran, kita perlu memahami apa itu atomicity. Apa yang dipanggil atomicity hanya bermaksud bahawa setiap operasi sama ada tidak dilakukan atau dilakukan. Melakukan semua bermakna ia tidak boleh diganggu semasa operasi Contohnya, untuk menambah satu kepada data pembolehubah, terdapat tiga langkah berikut: tambah data Muatkan daripada ingatan ke dalam daftar. Tambahkan satu pada nilai data. Tulis hasilnya kembali ke ingatan. Atomicity bermaksud bahawa apabila utas menjalankan operasi kenaikan, ia tidak boleh diganggu oleh utas lain Hanya apabila utas ini menyelesaikan ketiga-tiga proses ini

See all articles