1. 程式人生 > >髒讀(菜鳥玩執行緒)

髒讀(菜鳥玩執行緒)

髒讀

髒讀一定會出現在操作例項變數的情況下,這就是不同執行緒”爭搶“例項變數的結果。

髒讀示例

定義共享變數例項類

package com.chapter02.dirtyRead;

public class PublicVar {
    public String username = "A";
    public String password = "AA";

    //新增synchronized
    synchronized public void setVaule(String username, String password) {
        try {
            this
.username = username; Thread.sleep(5000); this.password = password; System.out.println("setValue method , thread name= " + Thread.currentThread().getName() + ", username = " + username + ", password = " + password); } catch
(InterruptedException e) { e.printStackTrace(); } } //無 synchronized public void getValue() { System.out.println("getValue method , thread name= " + Thread.currentThread().getName() + ", username = " + username + ", password = "
+ password); } }

自定義執行緒類

package com.chapter02.dirtyRead;
public class ThreadA extends Thread {
    private PublicVar publicVar;

    public ThreadA(PublicVar publicVar) {
        this.publicVar = publicVar;
    }

    @Override
    public void run() {
        super.run();
        publicVar.setVaule("B", "BB");
    }
}

啟動類

package com.chapter02.dirtyRead;

public class TestRun {
    public static void main(String[] args) {
        try {
            PublicVar publicVar = new PublicVar();
            ThreadA threadA = new ThreadA(publicVar);
            threadA.start();
            Thread.sleep(2000); //列印結果受此值的影響
            publicVar.getValue();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

執行結果

//出現髒讀
getValue method , thread name= main, username = B, password = AA
setValue method , thread name= Thread-0, username = B, password = BB

總結

當A執行緒呼叫PublicVar物件加入synchronized關鍵字的setVaule()方法時,A執行緒就獲得了setVaule()方法的鎖,更準確的講,是獲得了物件的鎖,所以其他執行緒必須等到A執行緒執行完畢才可以呼叫setVaule()方法,但B執行緒可以隨意呼叫其他的非synchronized方法。

防止髒讀示例

修改

修改上面“定義共享變數例項類PublicVar ”中的getValue()方法,增加synchronized關鍵字,如下:

package com.chapter02.dirtyRead;

public class PublicVar {
    public String username = "A";
    public String password = "AA";

    //新增synchronized
    synchronized public void setVaule(String username, String password) {
        try {
            this.username = username;
            Thread.sleep(5000);
            this.password = password;
            System.out.println("setValue method , thread name= " + Thread.currentThread().getName() +
                    ", username = " + username +
                    ", password = " + password);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //有 synchronized
    synchronized public void getValue() {
        System.out.println("getValue method , thread name= " + Thread.currentThread().getName() +
                ", username = " + username +
                ", password = " + password);
    }
}

執行結果

setValue method , thread name= Thread-0, username = B, password = BB
getValue method , thread name= main, username = B, password = BB

總結

當A執行緒呼叫PublicVar物件加入synchronized關鍵字的setVaule()方法時,A執行緒就獲得了setValue()方法所在物件的鎖,所以其他執行緒必須等A執行緒執行完畢才可以呼叫setValue()方法,而B執行緒如果呼叫聲明瞭synchronized關鍵字的getValue()方法時,必須等A執行緒將setValue()方法執行完,也就是釋放物件鎖後才可以呼叫。這時A執行緒執行了一個完整的任務,也就是說username和password這兩個例項變數已經同時被賦值,不存在髒讀的基本環境。

相關推薦

執行

髒讀 髒讀一定會出現在操作例項變數的情況下,這就是不同執行緒”爭搶“例項變數的結果。 髒讀示例 定義共享變數例項類 package com.chapter02.dirtyRead; public cl

暫停執行執行

暫停執行緒 暫停執行緒,即執行緒還可以恢復執行。 Java多執行緒中,可以使用suspend()方法停止執行緒,使用resume()方法恢復執行緒的執行。 suspend與resume方法的使用 直接上

執行優先順序執行

執行緒的優先順序 在作業系統中,執行緒可以劃分為優先順序,優先順序較高的執行緒得到的CPU資源較多,也就是CPU優先執行優先順序較高的執行緒物件中的任務。 設定執行緒的優先順序使用setPriority

synchronized同步方法執行

synchronized同步方法 方法內的變數是執行緒安全的 實驗1: 共享變數類 package com.chapter02.thread1; public class HasSelfPrivate

鎖物件的改變執行

鎖物件的改變 理論 在將任何資料型別作為同步鎖時,需注意的是,是否有多個執行緒同時持有鎖物件,如果同時持有相同的鎖物件,則這些執行緒之間就是同步的; 如果分別獲得鎖物件,這些執行緒之間就是非同步的。 示

synchronized一半同步一半非同步執行

synchronized一半同步一半非同步 論證 不在synchronized塊中就是非同步執行,在synchronized塊中就是同步執行。 示例 自定義共享類 package com.chapter02.thread4; public class Task

synchronized資料型別String的常量池特性執行

synchronized資料型別String的常量池特性 在JVM虛擬機器中有String常量池快取的功能,將synchronized(String)同步塊與String聯合起來使用時,注意常量池帶來的

synchronized驗證3個理論執行

synchronized驗證3個理論 1.論證1 1.1理論 當多個執行緒同時執行synchronized(非this)同步程式碼塊時呈同步效果。 1.2落地 1.2.1自定義鎖物件類 package com.chapter02.thread2_2_8_1; p

Java多執行入門&執行安全

什麼是程序 電腦中時會有很多單獨執行的程式,每個程式有一個獨立的程序,而程序之間是相互獨立存在的。比如下圖中的QQ、酷狗播放器、電腦管家等等。 什麼是執行緒 程序想要執行任務就需要依賴執行緒。換句話說,就是程序中的最小執行單位就是執行緒,並且一個程序中至少有一個

C語言經典例題教程100例

這兩天正在看基礎的演算法,在做的時候肯定不能避免的接觸了菜鳥上的經典100例,但是使用的時候發現並不是那麼的方便,因為它只是給了序號,如果查詢某一問題的話很不方便,所以做了這篇部落格,希望給自己和其他人帶來幫助!

群聊實現tcp和多執行

服務端程式碼 package com.cyj.tcp.chat2; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import ja

ucontext實現的使用者級多執行框架2搶先式多執行

#include "uthread.h"#include <assert.h>#include <stdlib.h>#include <time.h>ucontext_t Scheduler::ucontext;char Scheduler::stack[4096];u

執行至少三個執行分別列印A、B、C,要求按ABC的順序迴圈列印10次。

看到網上一道題,三個執行緒按順序列印A、B、C迴圈10次,於是自己按幾種方法也寫了一下: 一、用執行緒池、Lock鎖和condition(Object 監視器方法的使用)組合使用實現: package multithread; import java.util.concu

《Efficient Android Threading》Chapter 3---Threads on Android Android中的執行

Android中的執行緒 序:        閱讀英文原版,受益匪淺。修飾詞形容惟妙惟肖。        其中舉例之圖,經典,且秒不可言。亦當細細品味之。        翻譯為谷歌翻譯。 重點單詞日後補上,可用有道詞典積累,認識的單詞會越來越多  

Android連線伺服器,從伺服器獲取資料,以及從伺服器下載檔案單,多執行

首先需要在Eclipse中建立一個伺服器,在其中存入要下載的檔案,具體可參考之前的伺服器篇。 ScollView可以上下滑動 另外還有,android中的網路連線與之前java中可以通用,可以參照之前伺服器客戶端通訊篇。 新增的許可權

綜合應用題:多執行複製檔案知識點:多執行、隨機寫流

要求:使用多執行緒複製一個檔案(使用多執行緒複製一個檔案可以加快檔案的複製速度) 程式碼: package 多執行緒複製檔案; import java.io.File; import java.io.FileNotFoundException; impor

Ubuntu分區方案方案、常用方案和進階方案

變化 格式化 執行 菜鳥 格式 分開 清理 知識庫 重新 菜鳥方案 “/”與swap兩個分區就可以應付絕大多數的應用 常用方案 分為3個區 1. 掛載點/;主分區;安裝系統和軟件;大小為30G;分區格式為ext4; 2. 掛載點/home;邏輯分區;相當於“我的文檔”;大小

java語言登陸界面

pub oid box nts ring 實現 visible logs 更換 最近在看的Java入門書是《Head First》,一本很棒的Java書。 老師要求的程序流程圖我沒有,之前我們的做法是寫完代碼再畫流程圖,我想這樣的做法是不對的,流程圖應該是在寫代碼之前設計思

服務器的理解

貴的 服務器的理解 在家 tro show 筆記 serve 操作 蜘蛛 服務器的定義  服務器是網絡上一種為客戶站點提供各種服務的計算機,它在網絡操作系統的控制下,將與其相連的硬盤、磁帶、打印機、Modem及昂貴的專用通訊設備提供給網絡上的客戶站點共享,也能為網絡用戶提

HTML中的無序列表講解

cnblogs 商品列表 fin 圓點 list 包含 單獨 有序列表 註意 什麽是列表標簽? 1.列表標簽的作用:給一堆數據添加列表語義,也就是告訴搜素引擎告訴瀏覽器這一堆數據是一個整體。 2.HTML中列表標簽的分類   2.1無序列表(最多人用)(unordered