java執行緒安全,同步,非同步
執行緒是比程序更小的執行單位,是在程序基礎上進行的進一步劃分。所謂多執行緒是指程序在執行過程中可以產生多個同時存在、同時執行的執行緒。多程序機制可以合理利用資源,提高程式的執行效率。一個程序至少包含一個執行緒(JVM虛擬機器的啟動是多執行緒的,至少有兩個執行緒:main 和垃圾回收機制)。
1、什麼是執行緒安全?
程序在執行時為了更好的利用資源提高執行效率,會產生多個執行緒,但是這多個執行緒執行時,會對同一個資源同時進行操作,也稱之為執行緒非同步,例如:執行緒A,B在對同一個連結串列進行操作時,如果出現了A對連結串列進行讀取的同時,執行緒B同時對其進行寫入資料。顯然這樣是非常不好的。那麼就需要執行緒同步。
2、何為執行緒同步?
執行緒同步:通俗而言就是,當執行緒A在對某一資源進行操作時,那麼執行緒B以及其他執行緒就必須等待,此時不能對這一資源進行操作。即執行緒A、B按照預定的計劃對這一資源進行非同時訪問。
3、執行緒安全:對於執行緒非同步,這樣的執行緒在執行時是不安全的,所以就引進同步。
//java中實現多執行緒有兩種方法,繼承自Thread類,實現Runnable介面。
//1 繼承自Thread介面需要實現run方法,
public class ThreadDemo extends Thread{
private String name;
public ThreadDemo(String name){
this.name=name;
}
//重寫Thread類中的run方法
public void run(){
for(int i=0;i<=10;i++){
System.out.println(name+"執行i="+i);
}
}
public static void main(String [] name){
new ThreadDemo("執行緒A").start();
new ThreadDemo("執行緒B").start();
}
}
結果證明:執行緒A,B交錯執行。
public class RunnableDemo implements Runnable{
private String name;
public RunnableDemo(String name){
this.name=name;
}
@Override
public void run() {
for(int i=1;i<=15;i++){
System.out.println(name+"執行i="+i);
}
}
public static void main(String [] args){
RunnableDemo demo1=new RunnableDemo("執行緒A");
RunnableDemo demo2=new RunnableDemo("執行緒B");
Thread thread1=new Thread(demo1);//例項化Thread類
Thread thread2=new Thread(demo2);//例項化Thread類
thread1.start();//啟動執行緒
thread2.start();//啟動執行緒
}
}
//注意啟動多執行緒必須使用Thread類實現
Thread類與Runnable介面的區別,如果繼承自Thread類,不適合多個執行緒共享資源,而實現了Runnable介面可以方便的實現資源共享。
public class ThreadDemo2 extends Thread{
private String name;
private int ticket=15;
public void run(){
for(int i=0;i<=15;i++){
if(ticket>0){
System.out.println(name+"賣票:ticket="+ticket--);
}
}
}
public ThreadDemo2(String name){
this.name=name;
}
public static void main(String[] args){
ThreadDemo2 demo1=new ThreadDemo2("執行緒A");
ThreadDemo2 demo2=new ThreadDemo2("執行緒B");
ThreadDemo2 demo3=new ThreadDemo2("執行緒C");
new Thread(demo1).start();
new Thread(demo2).start();
new Thread(demo3).start();
}
}
//結果證明執行緒A,B,C都各自賣出15張票
public class RunnableDemo2 implements Runnable{
private int ticket=10;
public void run() {
for(int i=1;i<=5;i++){
if(ticket>0){
System.out.println("賣票:ticket="+ticket--);
}
}
}
public static void main(String[] args) {
RunnableDemo2 demo1=new RunnableDemo2();
new Thread(demo1).start();
new Thread(demo1).start();
new Thread(demo1).start();
}
}
//結果如下:賣票:ticket=10
賣票:ticket=9
賣票:ticket=8
賣票:ticket=7
賣票:ticket=6
賣票:ticket=5
賣票:ticket=4
賣票:ticket=3
賣票:ticket=2
賣票:ticket=1
實現Runnable介面與繼承自Thread類在實現多執行緒中相比具備以下優勢
(1) 適合多個具有相同程式程式碼的執行緒處理同一資源
(2)避免java單繼承特徵帶來的侷限
(3)程式碼能夠被多個執行緒共享且資料獨立存在,從而增強了程式的健壯性。
4、執行緒同步
同步是指同一時間段內只能執行一個執行緒,其他執行緒需要等待此執行緒完成後才可繼續執行。同步可以解決執行緒中資源共享的安全問題,主要有同步程式碼塊和同步方法兩種方式完成。
1)同步程式碼塊格式
synchronized(同步物件){
需要同步的程式碼塊
}
public class SynchronizedDemo implements Runnable{
private int ticket=5;
public void run() {
for(int i=1;i<=5;i++){
synchronized (this) {
if(ticket>0){
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("賣票:ticket="+ticket--);
}
}
}
}
public static void main(String[] args) {
SynchronizedDemo demo1=new SynchronizedDemo();
new Thread(demo1).start();
new Thread(demo1).start();
new Thread(demo1).start();
}
}
結果如下:
賣票:ticket=5
賣票:ticket=4
賣票:ticket=3
賣票:ticket=2
賣票:ticket=1
如果沒有加入執行緒同步方法,則賣票會出現負數
另外有同步方法
格式如下:
synchronized 方法返回型別方法名稱(引數列表){
}
5、執行緒的生命週期/
1)建立狀態
2)就緒狀態
3)執行狀態
4)阻塞狀態
5)終止狀態
相關推薦
java執行緒安全,同步,非同步
執行緒是比程序更小的執行單位,是在程序基礎上進行的進一步劃分。所謂多執行緒是指程序在執行過程中可以產生多個同時存在、同時執行的執行緒。多程序機制可以合理利用資源,提高程式的執行效率。一個程序至少包含一
java執行緒總結--synchronized關鍵字,原理以及相關的鎖
在多執行緒程式設計中,synchronized關鍵字非常常見,當我們需要進行“同步”操作時,我們很多時候需要該該關鍵字對程式碼塊或者方法進行鎖定。被synchronized鎖定的程式碼塊,只能同時有一條執行緒訪問該程式碼塊。 上面是很多人的認識,當然也是我之前對synchronized關鍵字的淺
高併發程式設計系列:4種常用Java執行緒鎖的特點,效能比較、使用場景
高併發程式設計系列:4種常用Java執行緒鎖的特點,效能比較、使用場景 http://youzhixueyuan.com/4-kinds-of-java-thread-locks.html 在Java併發程式設計中,經常遇到多個執行緒訪問同一個 共享資源 ,這時候作為開發者
4種常用Java執行緒鎖的特點,效能比較、使用場景
文章目錄 多執行緒的緣由 多執行緒併發面臨的問題 4種Java執行緒鎖(執行緒同步) Java執行緒鎖總結 多執行緒的緣由 在出現了程序之後,作業系統的效能得到了大大的提升。雖然程序的出現解決了作業系統的併
JAVA執行緒有哪些狀態,這些狀態之間是如何轉化的?
新建(new):新建立了一個執行緒物件。可執行(runnable):執行緒物件建立後,其他執行緒(比如main執行緒)呼叫了該物件的start()方法。該狀態的執行緒位於可執行執行緒池中,等待被執行緒排程選中,獲取cpu 的使用權 。執行(running):可執行狀態(run
Java執行緒池詳解,看這篇就夠了!
構造一個執行緒池為什麼需要幾個引數?如果避免執行緒池出現OOM?Runnable和Callable的區別是什麼?本文將對這些問題一一解答,同時還將給出使用執行緒池的常見場景和程式碼片段。 基礎知識 Executors建立執行緒池 Java中建立執行緒池很簡單,只需要呼叫Execu
【本人禿頂程式設計師】Java執行緒池詳解,看這篇就夠了!
←←←←←←←←←←←← 快!點關注!!! 構造一個執行緒池為什麼需要幾個引數?如果避免執行緒池出現OOM?Runnable和Callable的區別是什麼?本文將對這些問題一一解答,同時還將給出使用執行緒池的常見場景和程式碼片段。 基礎知識 Executors建立執行緒池 J
JAVA執行緒的Factory類,以便自定義執行緒名
package com.opensource; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomi
簡單測試Java執行緒安全中阻塞同步與非阻塞同步效能
摘抄自周志明老師的《深入理解Java虛擬機器:JVM高階特性與最佳實踐》13.2.2 執行緒安全的實現方法 1.名詞解釋 同步是指鎖哥執行緒併發訪問共享資料時,保證共享資料同一時刻只被一個執行緒訪問 互斥同步(阻塞同步)是一種悲觀的併發策略,總是認為只要不去做正確的同步措施(加鎖),那就肯定會出現問題。 阻塞
Java多執行緒之執行緒安全與同步例項
1.1 執行緒安全與同步例項 1.1.1 購票同步物件鎖 【 /* * 用程式模擬鐵路售票系統:實現通過兩個售票點發售某日某次列車的50張車票, * 一個售票點用一個執行緒表示 */ publicclass SyncDemo { publi
Java執行緒之釋放鎖,釋放資源,釋放CPU
多執行緒中的wait與sleep到底誰釋放了鎖 首先,多執行緒中會使用到兩個延遲的函式,wait和sleep。 wait是Object類中的方法,而sleep是Thread類中的方法。 sleep是Thread類中的靜態方法。無論是在a執行緒中呼叫b的sl
java執行緒安全問題以及同步的幾種方式
一、執行緒併發同步概念執行緒同步其核心就在於一個“同”。所謂“同”就是協同、協助、配合,“同步”就是協同步調昨,也就是按照預定的先後順序進行執行,即“你先,我等, 你做完,我再做”。執行緒同步,就是當執行緒發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不會返回,其他執行緒也
4種常用Java執行緒鎖的特點,效能比較及使用場景
開發十年,就只剩下這套架構體系了! >>>
java執行緒的五大狀態,阻塞狀態詳解
# 一、狀態簡介 一個執行緒的生命週期裡有五大狀態,分別是: 1. 新生 2. 就緒 3. 執行 4. 死亡 5. 執行後可能遇到的阻塞狀態 # 二、相關方法 ## 2.1 新生狀態 ```java Thread t = new Thread(); ``` 正如我們前面所說的
Java執行緒安全類
執行緒不安全的類: HashMap LinkedHashMap TreeMap ArrayList LinkedList HashSet TreeSet LinkedHashSet StringBuilder 執行緒安全的類: ConcurrentHashMap Hasht
Java執行緒安全與多執行緒開發
網際網路上充斥著對Java多執行緒程式設計的介紹,每篇文章都從不同的角度介紹並總結了該領域的內容。但大部分文章都沒有說明多執行緒的實現本質,沒能讓開發者真正“過癮”。 從Java的執行緒安全鼻祖內建鎖介紹開始,讓你瞭解內建鎖的實現邏輯和原理以及引發的效能問題,接著說明了Java多執行緒程式設計中鎖的存在是為
Java執行緒之Synchronized同步————Java學習之路(17)
前言——不進則退啊,部落格幾天沒寫,排名第一次下降了,得勤奮更新,不能偷懶。。 歡迎轉載,轉載請註明來處。 目錄 一.演示同步問題 此前,我們用的多執行緒都是較為簡單的例子,都沒有涉及到多個執行緒共享同一個物件或者資源的情況。倘若多執行緒共享資
java執行緒安全問題
併發搶票過程中,如果不加同步鎖,就會出現執行緒不安全問題,導致程式碼執行結果出現嚴重問題。另外同一個執行緒啟動多次是不允許的。package sx.test.thread;public class TicketDemo {public static void main(Str
Java-執行緒安全
Java-執行緒安全 0x01 什麼是執行緒安全 執行緒安全是針對某個物件來說,如果當多執行緒訪問此物件時,不用再用額外方式如同步鎖等,總能執行獲得正確結果,那就可以說這個物件程式碼執行緒安全。 0x02 Java中的執行緒安全 Java中執行緒安全強度由強到弱是: 不可
關於java執行緒安全問題
執行緒:負責一個程序中的程式碼執行。執行緒是程序中的一個執行路徑。 執行緒安全問題出現的根本原因:1. 存在著兩個或者兩個以上的執行緒。2. 多個執行緒共享了著一個資源, 而且操作資源的程式碼有多句。 執行緒安全問題的解決方案:1. 使用同步程式碼塊格式:synchroni