大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

Java多線程編程概述
Java多線程的安全問(wèn)題
Java多線程同步
Java多線程間的通信
Java線程Lock
Java多線程管理
保障線程安全的設(shè)計(jì)技術(shù)
Java鎖的優(yōu)化及注意事項(xiàng)
Java多線程集合
【Java多線程】單例模式與多線程

Java多線程讀寫(xiě)鎖

synchronized內(nèi)部鎖與ReentrantLock鎖都是獨(dú)占鎖(排它鎖), 同一時(shí)間只允許一個(gè)線程執(zhí)行同步代碼塊,可以保證線程的安全性,但是執(zhí)行效率低。

ReentrantReadWriteLock讀寫(xiě)鎖是一種改進(jìn)的排他鎖,也可以稱作共享/排他鎖. 允許多個(gè)線程同時(shí)讀取共享數(shù)據(jù),但是一次只允許一個(gè)線程對(duì)共享數(shù)據(jù)進(jìn)行更新。

讀寫(xiě)鎖通過(guò)讀鎖與寫(xiě)鎖來(lái)完成讀寫(xiě)操作. 線程在讀取共享數(shù)據(jù)前必須先持有讀鎖,該讀鎖可以同時(shí)被多個(gè)線程持有,即它是共享的.線程在修改共享數(shù)據(jù)前必須先持有寫(xiě)鎖,寫(xiě)鎖是排他的, 一個(gè)線程持有寫(xiě)鎖時(shí)其他線程無(wú)法獲得相應(yīng)的鎖。

讀鎖只是在讀線程之間共享,任何一個(gè)線程持有讀鎖時(shí),其他線程都無(wú)法獲得寫(xiě)鎖, 保證線程在讀取數(shù)據(jù)期間沒(méi)有其他線程對(duì)數(shù)據(jù)進(jìn)行更新,使得讀線程能夠讀到數(shù)據(jù)的最新值,保證在讀數(shù)據(jù)期間共享變量不被修改。

    獲得條件 排他性 作用
讀鎖 寫(xiě)鎖未被任意線程持有 對(duì)讀線程是共享的,對(duì)寫(xiě)線程是排他的 允許多個(gè)讀線程可以同時(shí)讀取共享數(shù)據(jù),保證在讀共享數(shù)據(jù)時(shí),沒(méi)有其他線程對(duì)共享數(shù)據(jù)進(jìn)行修改
寫(xiě)鎖 該寫(xiě)鎖未被其他線程持有,并且相應(yīng)的讀鎖也未被其他線程持有 對(duì)讀線程或者寫(xiě)線程都是排他的 保證寫(xiě)線程以獨(dú)占的方式修改共享數(shù)據(jù)

讀寫(xiě)鎖允許讀讀共享, 讀寫(xiě)互斥,寫(xiě)寫(xiě)互斥。

在java.util.concurrent.locks包中定義了ReadWriteLock接口,該接口中定義了readLock()返回讀鎖,定義writeLock()方法返回寫(xiě)鎖. 該接口的實(shí)現(xiàn)類是ReentrantReadWriteLock。

注意readLock()與writeLock()方法返回的鎖對(duì)象是同一個(gè)鎖的兩個(gè)不同的角色, 不是分別獲得兩個(gè)不同的鎖. ReadWriteLock接口實(shí)例可以充當(dāng)兩個(gè)角色.讀寫(xiě)鎖的其他使用方法。

//定義讀寫(xiě)鎖
ReadWriteLock  rwLock = new ReentrantReadWriteLock();
//獲得讀鎖
Lock readLock = rwLock.readLock();
//獲得寫(xiě)鎖
Lock writeLock = rwLock.writeLock();
//讀數(shù)據(jù)
readLock.lock();		//申請(qǐng)讀鎖
try{
   讀取共享數(shù)據(jù)
}finally{
   readLock.unlock();  //總是在finally子句中釋放鎖
}
//寫(xiě)數(shù)據(jù)
writeLock.lock(); 		//申請(qǐng)寫(xiě)鎖
try{
   更新修改共享數(shù)據(jù)
}finally{
   writeLock.unlock();  //總是在finally子句中釋放鎖
}

讀讀共享

ReadWriteLock讀寫(xiě)鎖可以實(shí)現(xiàn)多個(gè)線程同時(shí)讀取共享數(shù)據(jù),即讀讀共享,可以提高程序的讀取數(shù)據(jù)的效率。

package com.wkcto.lock.readwrite;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * ReadWriteLock讀寫(xiě)鎖可以實(shí)現(xiàn)讀讀共享,允許多個(gè)線程同時(shí)獲得讀鎖
 */
public class Test01 {
    static class Service{
        //定義讀寫(xiě)鎖
        ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
        //定義方法讀取數(shù)據(jù)
        public void read(){
            try {
                readWriteLock.readLock().lock();        //獲得讀鎖
                System.out.println(Thread.currentThread().getName() + "獲得讀鎖,開(kāi)始讀取數(shù)據(jù)的時(shí)間--" + System.currentTimeMillis());
                TimeUnit.SECONDS.sleep(3);  //模擬讀取數(shù)據(jù)用時(shí)
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                readWriteLock.readLock().unlock();  //釋放讀鎖
            }
        }
    }

    public static void main(String[] args) {
        Service service = new Service();

        //創(chuàng)建5個(gè)線程,調(diào)用read()方法
        for (int i = 0; i < 5; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    service.read();     //在線程中調(diào)用read()讀取數(shù)據(jù)
                }
            }).start();
        }
        //運(yùn)行程序后,這多個(gè) 線程幾乎可以同時(shí)獲得鎖讀,執(zhí)行l(wèi)ock()后面的代碼
    }
}

寫(xiě)寫(xiě)互斥

通過(guò)ReadWriteLock讀寫(xiě)鎖中的寫(xiě)鎖,只允許有一個(gè)線程執(zhí)行l(wèi)ock()后面的代碼。

package com.wkcto.lock.readwrite;

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * 演示ReadWriteLock的writeLock()寫(xiě)鎖是互斥的,只允許有一個(gè)線程持有
 */
public class Test02 {
    static class Service{
        //先定義讀寫(xiě)鎖
        ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
        //定義方法修改數(shù)據(jù)
        public void write(){
            try {
                readWriteLock.writeLock().lock();       //申請(qǐng)獲得寫(xiě)鎖
                System.out.println(Thread.currentThread().getName() + "獲得寫(xiě)鎖,開(kāi)始修改數(shù)據(jù)的時(shí)間--" + System.currentTimeMillis());
                Thread.sleep(3000);     //模擬修改數(shù)據(jù)的用時(shí)
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                System.out.println(Thread.currentThread().getName() + "讀取數(shù)據(jù)完畢時(shí)的時(shí)間==" + System.currentTimeMillis());
                readWriteLock.writeLock().unlock();     //釋放寫(xiě)鎖
            }
        }
    }

    public static void main(String[] args) {
        Service service = new Service();

        //創(chuàng)建5個(gè)線程修改數(shù)據(jù)
        for (int i = 0; i < 5; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    service.write();    //調(diào)用修改數(shù)據(jù)的方法
                }
            }).start();
        }
        //從執(zhí)行結(jié)果來(lái)看,同一時(shí)間只有一個(gè)線程獲得寫(xiě)鎖
    }
}

讀寫(xiě)互斥

寫(xiě)鎖是獨(dú)占鎖,是排他鎖,讀線程與寫(xiě)線程也是互斥的。

package com.wkcto.lock.readwrite;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * 演示ReadWriteLock的讀寫(xiě)互斥
 *  一個(gè)線程獲得讀鎖時(shí),寫(xiě)線程等待; 一個(gè)線程獲得寫(xiě)鎖時(shí),其他線程等待
 */
public class Test03 {
    static class Service{
        //先定義讀寫(xiě)鎖
        ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
        Lock readLock = readWriteLock.readLock();       //獲得讀鎖
        Lock writeLock = readWriteLock.writeLock();     //獲得寫(xiě)鎖
        //定義方法讀取數(shù)據(jù)
        public void read(){
            try {
                readLock.lock();       //申請(qǐng)獲得讀鎖
                System.out.println(Thread.currentThread().getName() + "獲得讀鎖,開(kāi)始讀取數(shù)據(jù)的時(shí)間--" + System.currentTimeMillis());
                Thread.sleep(3000);     //模擬讀取數(shù)據(jù)的用時(shí)
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                System.out.println(Thread.currentThread().getName() + "讀取數(shù)據(jù)完畢時(shí)的時(shí)間==" + System.currentTimeMillis());
                readLock.unlock();     //釋放讀鎖
            }
        }
        //定義方法修改數(shù)據(jù)
        public void write(){
            try {
                writeLock.lock();       //申請(qǐng)獲得寫(xiě)鎖
                System.out.println(Thread.currentThread().getName() + "獲得寫(xiě)鎖,開(kāi)始修改數(shù)據(jù)的時(shí)間--" + System.currentTimeMillis());
                Thread.sleep(3000);     //模擬修改數(shù)據(jù)的用時(shí)
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                System.out.println(Thread.currentThread().getName() + "修改數(shù)據(jù)完畢時(shí)的時(shí)間==" + System.currentTimeMillis());
                writeLock.unlock();     //釋放寫(xiě)鎖
            }
        }
    }

    public static void main(String[] args) {
        Service service = new Service();

       //定義一個(gè)線程讀數(shù)據(jù)
        new Thread(new Runnable() {
            @Override
            public void run() {
                service.read();
            }
        }).start();
        //定義一個(gè)線程寫(xiě)數(shù)據(jù)
        new Thread(new Runnable() {
            @Override
            public void run() {
                service.write();
            }
        }).start();
    }
}

 

全部教程
主站蜘蛛池模板: 欧美另类videos粗暴黑人 | 欧美一级特黄乱妇高清视频 | 人与禽交免费网站视频 | 老子影院午夜久久亚洲 | 波多野结衣在线一区 | 国产成人精品午夜 | 91久久精品国产一区二区 | 88国产经典欧美一区二区三区 | 免费黄色在线 | 免费夜色污私人影院网站 | 一级毛片播放 | 五月婷婷社区 | 亚洲精品影院一区二区 | 欧美日本一本线在线观看 | 极品精品国产超清自在线观看 | 在线观看一区二区精品视频 | 伊人网久久网 | 老司机永久免费网站在线观看 | 在线日韩不卡 | 最新日本免费一区二区三区中文 | 日韩免费一级毛片欧美一级日韩片 | 国产亚洲欧美久久精品 | 久久亚洲国产精品五月天婷 | 国产在线视频99 | 日本久久久久亚洲中字幕 | 玖玖成人 | 一区二区网站 | 黄色毛片免费看 | 四虎海外影库www4hu | 国产精品免费视频播放 | 国产亚洲一级精品久久 | 欧美 日韩 中文 | 国产aaa免费视频国产 | 国产一区二区日韩欧美在线 | 91在线成人 | 婷婷玖玖 | 亚洲国产高清在线精品一区 | 国产日| 日韩欧美亚洲一区精选 | 色中文字幕在线 | 欧美大片aaaa一级毛片 |