髒讀(菜鳥玩執行緒)
髒讀
髒讀一定會出現在操作例項變數的情況下,這就是不同執行緒”爭搶“例項變數的結果。
髒讀示例
定義共享變數例項類
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