1. 程式人生 > >Java多執行緒執行緒安全實現方式

Java多執行緒執行緒安全實現方式

執行緒安全就是要保證資料的高度一致性和準確性,但不是一定要加鎖才是執行緒安全性,只要程式碼裡沒有變數互串,執行緒之間互不影響,就是執行緒安全的。
要了解執行緒安全,可以先看一下執行緒不安全是怎樣的一種現象。

public class TreadNoSafeDemo {
    public static void main(String[] args) {
       new ThreadNoSafeTest().start();
       new ThreadNoSafeTest().start();
       new ThreadNoSafeTest().start();
       new
ThreadNoSafeTest().start(); } } class ThreadNoSafeTest extends Thread{ private int num=5; @Override public void run() { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"................."
+(--num)); } }

這裡寫圖片描述
由執行結果可以看出:–num輸出的並不是我們認為的 4 3 2 1;這就是執行緒的不安全現象。

那怎麼才能實現執行緒安全呢?Java給我們提供了哪些機制?
想要實現執行緒安全大致有三種方法:

  • 不適用單例模式,而是用多例項。
  • 使用鎖機制Synchronized、lock方式。
  • 使用java.util.concurrent下面的類庫。

下面對具體的方法進行介紹:
隱式鎖(執行緒同步synchronized)
執行緒同步synchronized有兩種方式,一種是放在同步方法上,一種是放在同步程式碼塊裡。
同步方法:

 public
synchronized void methodTest(){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "................." + (--num)); }

同步程式碼塊

 public void methodTest(){
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        synchronized (object) {
            System.out.println(Thread.currentThread().getName() + "................." + (--num));
        }
    }

顯示鎖Lock和ReentrantLock
加鎖和解鎖都是顯示的。
Lock介面(java.util.concurrent.locks.Lock)的主要方法為:
這裡寫圖片描述

ReentrantLock是Lock的實現類,是一個互斥的同步器。
在競爭條件下ReentrantLock的實現要比synchronized的實現更具有伸縮性,這意味著當許多執行緒都競爭相同鎖定時,使用ReentrantLock的吞吐量通常要比synchronized好
ReentrantLock是對方法塊加鎖使用頻率最高點。
使用方法:

class ReentrantLockTest{
    private final ReentrantLock reentrantLock=new ReentrantLock();
    public void methodTest(){
        reentrantLock.lock();
        try {
            //...............................
        }catch (Exception e){

        }
        reentrantLock.unlock();
    }
}

顯示鎖ReadWriteLock和ReentrantReadWriteLock
ReadWriteLock也是一個介面,提供了readLock和writeLock兩種鎖的操作機制,一個用於只讀操作,另一個用於寫入操作。只要沒有 writer,讀取鎖可以由多個 reader 執行緒同時保持。寫入鎖是獨佔的。讀寫鎖使用的場景是一個共享資源被大量的讀取操作而只有少量的寫操作。(讀讀不互斥,讀寫互斥,寫寫互斥;)。
ReentrantReadWriteLock和ReentrantLock區別:ReentrantReadWriteLock是對ReentrantLock的複雜擴充套件,ReentrantReadWriteLock可以實現一個方法中讀寫分離的鎖的機制,而ReentrantLock加鎖解鎖只是一種機制。

顯示鎖StampedLock
StampedLock可大幅度提高程式的讀取鎖的吞吐量。在大量都是讀取、很少寫入的情況下,樂觀讀鎖可以極大的提高吞吐量,也可以減少這種情況下寫的飢餓現象。

相關推薦

java線程的4種實現方式

exc div art num start read cut runnable pan 1,繼承Thread類,重寫run方法; public class Thread01 extends Thread{ public Thread01(){ }

Java線程的四種實現方式

util println 通過 泛型 pri png 返回值 sch get 1.Java多線程實現的方式有四種:1.繼承Thread類,重寫run方法2.實現Runnable接口,重寫run方法,實現Runnable接口的實現類的實例對象作為Thread構造函數的targ

Java執行執行安全實現方式

執行緒安全就是要保證資料的高度一致性和準確性,但不是一定要加鎖才是執行緒安全性,只要程式碼裡沒有變數互串,執行緒之間互不影響,就是執行緒安全的。 要了解執行緒安全,可以先看一下執行緒不安全是怎樣的一種

java 執行的一種實現方式

private ThreadPoolExecutor threadPoolExecutor; /** * 獲取執行緒池 * @return */ private ThreadPoolExecutor getThreadPoolExecutor(){

Java基礎之執行之原理、實現方式及匿名內部類建立執行方法

一、概念 程序:作業系統當中正在執行的一個程式。例如正在執行一個QQ。 執行緒:程序之內多工的執行單位。例如迅雷當中正在下載的多個電影。 JVM當中:棧(Stack)記憶體是執行緒獨立的,堆(Heap)記憶體是執行緒共享的。 (1)Java程式執行的時候至少有兩個執行緒: 1)主

Java執行之四種實現方式

介紹 繼承Thread類,並重寫其run方法 實現Runnable介面 實現Callable介面通過FutureTask包裝器來建立Thread執行緒 執行緒池,使用ExecutorService、Callable、Future實現有返回結果的多執行緒。 其

java執行的三種實現方式的極簡範例

java提供了三種多執行緒的實現方式,分別為:繼承Thread類、實現Runnable介面 和 實現Callable<>介面。 繼承Thread類 執行緒的執行體是run()方法,所以我們只需要過載父類的run()方法。建立類物件,呼叫start()

JAVA執行的四種實現方式

1.繼承Thread  重寫run()方法,該run方法表示執行緒要完成的任務。建立執行緒物件,呼叫物件的start()方法來啟動執行緒。 2.Runnable介面 重寫介面中run方法。建立Runable例項類的例項,並依此例項作為Thread的target來建立Th

java執行的6種實現方式詳解

多執行緒的形式上實現方式主要有兩種,一種是繼承Thread類,一種是實現Runnable介面。本質上實現方式都是來實現執行緒任務,然後啟動執行緒執行執行緒任務(這裡的執行緒任務實際上就是run方法)。這裡所說的6種,實際上都是在以上兩種的基礎上的一些變形。 繼承

java執行的6種實現方式詳解、執行池、定時器

多執行緒的形式上實現方式主要有兩種,一種是繼承Thread類,一種是實現Runnable介面。本質上實現方式都是來實現執行緒任務,然後啟動執行緒執行執行緒任務(這裡的執行緒任務實際上就是run方法)。這裡所說的6種,實際上都是在以上兩種的基礎上的一些變形。 繼承Thread

Java執行的三種實現方式

今天簡單說一下Java三種多執行緒實現方式和區別,主要有實現Runnable、Callable和繼承Thread三種方式。 實現Runnable的方式 這種方式比較常用,當我們的執行緒類有繼承其他的類的情況下(Java不支援類多繼承),並且執行緒任務不需要返回值的情況下可以選用這種方式。 1 public

執行學習(一):執行的兩種實現方式

程序和執行緒 程序是受作業系統管理的基本執行單元。 執行緒是在程序中獨立執行的子任務。 多執行緒的優點 使用多執行緒技術後,可以在同一時間內執行更多不同種類的任務。 單執行緒是同步執行任務,多執行緒是非同步執行任務。 多執行緒的使用方式 1:繼承Thread 2:實現

執行,兩種實現方式(繼承Thread,實現Runnable介面),設定獲取名字,同步程式碼塊、方法,死鎖

1.多執行緒的引入(瞭解) 1.什麼是執行緒 執行緒是程式執行的一條路徑, 一個程序中可以包含多條執行緒 多執行緒併發執行可以提高程式的效率, 可以同時完成多項工作 2.多執行緒的應用場景 紅蜘蛛同時共享螢幕給多個電腦 迅雷開啟多條執行緒一起下載 Q

執行的三種實現方式

Java中執行緒的實現有三種方式,分別是繼承Thread類、實現Runnable介面和實現Callable介面。 繼承Thread類 Thread類是Java.lang包中的一個類,從這個類中例項化的物件代表執行緒,程式設計師啟動一個新的執行緒需要建立Threa

Java線程-線程安全與不可變性

同時 cal safety pri 人的 便是 mut 在線 資源 以下內容轉自http://ifeve.com/thread-safety-and-immutability/: 當多個線程同時訪問同一個資源,並且其中的一個或者多個線程對這個資源進行了寫操作,才會產生競態

Java線程系列六——Map實現

coo cut tab for http current color text 加鎖 參考資料: https://crunchify.com/hashmap-vs-concurrenthashmap-vs-synchronizedmap-how-a-hashmap-can-

Java實現線程的四種實現方式

lis star 維護 invoke 1.0 threads arraylist urn fix 以計算0到1000之間的和為例 import java.util.ArrayList; import java.util.LinkedList; import java.uti

最近在研究線程,淺談JAVA線程的幾種實現方式

進行 數據 使用 導致 效率問題 多線程 方法 sta img 多線程的實現方式:   個人認為,要說多線程的實現方式,萬變不離其宗,最基本的就是兩種1.繼承Thread類;2.實現runnable接口,本質上來說就是用來啟動線程執行任務的過程,具體來說的話,通過這

java型引用場景及程式碼實現

class Test { public static void main(String[] args) { /** 動物類可以是狗 就吧狗創建出來 也叫向上轉型*/ Animal animalOne = new Dog(); /** 狗可以通用動物的

java型詳解(介面指向實現類)

為什麼要用介面引用指向實現類的物件 這種寫法其實Java多型的表現形式 多型的定義:指允許不同類的物件對同一訊息做出響應。即同一訊息可以根據傳送物件的不同而採用多種不同的行為方式。(傳送訊息就是函式呼叫)List list;是在棧區開闢一個空間放list引用,並沒有建立物件所以不知道ArrayList還