1. 程式人生 > >Java 多執行緒之synchronized關鍵字詳解

Java 多執行緒之synchronized關鍵字詳解

package com.example;

/**
 * Created by 晁東洋 on 2017/5/27.
 */

public class MyThreadClass {
    public static void main(String args[]){
        Exampletest example = new Exampletest();
        Thread thread = new ThreadTest1(example);
        Thread thread1 = new ThreadTest2(example);
        thread.start();
        thread1.start();
    }
}

class Exampletest {
    private Object object = new Object();

    public void execute()
    {
        synchronized (object)
        {
            for (int i = 0; i < 20; ++i)
            {
                try
                {
                    Thread.sleep((long) Math.random() * 1000);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
                System.out.println("Hello: " + i);
            }

        }

    }

    public void executetext()
    {
        synchronized (object)
        {
            for (int i = 0; i < 20; ++i)
            {
                try
                {
                    Thread.sleep((long) Math.random() * 1000);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
                System.out.println("World: " + i);
            }

        }

    }

}

class ThreadTest1 extends Thread {
    private Exampletest example;

    public ThreadTest1(Exampletest example)
    {
        this.example = example;
    }

    @Override
    public void run()
    {
        example.execute();
    }

}

class ThreadTest2 extends Thread {
    private Exampletest example;

    public ThreadTest2(Exampletest example)
    {
        this.example = example;
    }

    @Override
    public void run()
    {
        example.executetext();
    }

}

例子程式4所達到的效果和例子程式2的效果一樣,都是使得兩個執行緒的執行順序進行,而不是併發進行,當一個執行緒執行時,將object物件鎖住,另一個執行緒就不能執行對應的塊。

synchronized方法實際上等同於用一個synchronized塊包住方法中的所有語句,然後在synchronized塊的括號中傳入this關鍵字。當然,如果是靜態方法,需要鎖定的則是class物件。

可能一個方法中只有幾行程式碼會涉及到執行緒同步問題,所以synchronized塊比synchronized方法更加細粒度地控制了多個執行緒的訪問,只有synchronized塊中的內容不能同時被多個執行緒所訪問,方法中的其他語句仍然可以同時被多個執行緒所訪問(包括synchronized塊之前的和之後的)。

注意:被synchronized保護的資料應該是私有的

結論:

synchronized方法是一種粗粒度的併發控制,某一時刻,只能有一個執行緒執行該synchronized方法;

synchronized塊則是一種細粒度的併發控制,只會將塊中的程式碼同步,位於方法內、synchronized塊之外的其他程式碼是可以被多個執行緒同時訪問到的。



相關推薦

Java 執行synchronized關鍵字

package com.example; /** * Created by 晁東洋 on 2017/5/27. */ public class MyThreadClass { public static void main(String args[]){ Exampletest

JAVA執行Synchronized關鍵字--物件鎖的特點

一,介紹 本文介紹JAVA多執行緒中的synchronized關鍵字作為物件鎖的一些知識點。 所謂物件鎖,就是就是synchronized 給某個物件 加鎖。關於 物件鎖 可參考:這篇文章 二,分析 synchronized可以修飾例項方法,如下形式: 1 public class My

java執行synchronized和volatile關鍵字

synchronized同步方法 髒讀 在多個執行緒對同一個物件中的例項變數進行併發訪問的時候,取到的資料可能是被更改過的,稱之為“髒讀”,這就是非執行緒安全的。解決的方法為synchronized關鍵字進行同步,使之操作變成同步而非非同步。 public

Java執行synchronized

## 目錄 - synchronized簡介 - 同步的原理 - 物件頭與鎖的實現 - 鎖的優化與升級 - Monitor Record - 鎖的對比 ## synchronized簡介 `synchronized`關鍵字,一般稱之為“同步鎖”或者重量級鎖(JAVA SE 1.6之後引入了`偏向鎖`和`輕

Java執行Synchronized方式和CAS方式實現執行安全效能對比

效能比較猜想 1.大膽假設 在設計試驗方法之前,針對Synchronized和CAS兩種方式的特點,我們先來思考一下兩種方式效率如何? 首先,我們在回顧一下兩種方式是如何保證執行緒安全的。Synchronized方式通過大家應該很熟悉,他的行為非常悲觀,只要有一個執行緒進

java執行synchronized與lock、wait與notify

class Res { public String name; public String sex; public Boolean flag = false; public Lock lock = new ReentrantLock(); Condition condition = lock.new

java執行volatile關鍵字

在java執行緒併發處理中,關鍵字volatile的主要作用是使變數在多個執行緒間可見。那麼volatile到底該怎麼用了?我們首先來看一段程式碼: public class MyThread1 i

執行Future使用

什麼是Future Future是一個未來物件,裡面儲存這執行緒處理結果,它像一個提貨憑證,拿著它你可以隨時去提取結果 什麼時候使用 在兩種情況下,離開Future幾乎很難辦。 一種情況是拆分訂單,比如你的應用收到一個批量訂單,此時如果要求最快的處理訂單,那麼需要併發

Android 執行HandlerThread 完全

  之前對執行緒也寫過幾篇文章,不過倒是沒有針對android,因為java與android線上程方面大部分還是相同,不過本篇我們要介紹的是android的專屬類HandlerThread,因為HandlerThread在設定思想上還是挺值得我們學習的,那麼我們下面來

Java執行Condition介面原理

Condition介面提供了類似Object的監視器方法,與Lock配合可以實現等待/通知模式,但是這兩者在使用方式以及功能特性上還是有差別的 Condition介面詳解 Condition定義了等待/通知兩種型別的方法,當前執行緒呼叫這些方法時,需要提前獲

執行重排序

重排序 重排序是指編譯器和處理器為了優化程式效能而對指令序列進行重新排序的一種手段。 資料依賴性 如果兩個操作訪問同一個變數,且這兩個操作中有一個為寫操作,此時這兩個操作之間就存在資料的依賴性。資料依賴分為3中型別,如下表所示: 上面3中情況,只要重排序兩個操作的順序。程式的結

Java執行同步和非同步

1. 多執行緒併發時,多個執行緒同時請求同一資源,必然導致此資源的資料不安全。 2. 執行緒池 在WEB服務中,對於web伺服器的響應速度必須儘可能的快,這就容不得在使用者提交請求按鈕後,再建立執行緒提供服務。為了減少使用者的等待時間,執行緒必須預先建立,放線上程池中,執行

入坑JAVA執行併發(八)ThreadLocal使用和原理

  ThreadLocal是一個用於儲存多執行緒變數的類,它可以把執行緒與設定的值對應起來,因為它為變數在每個執行緒都建立了一個副本。訪問的時候每個執行緒只能訪問到自己的副本變數。 例項 看如下程式碼: public class Main {

JAVA執行Thread VS Runnable

要求 必備知識 本文要求基本瞭解JAVA程式設計知識。 開發環境 windows 7/EditPlus 演示地址 原始檔 程序與執行緒 程序是程式在處理機中的一次執行。一個程序既包括其所要執行的指令,也包括了執行指令所需的系統資源,不同程序所

執行 Final變數

原文: http://www.tuicool.com/articles/2Yjmqy 併發程式設計網:http://ifeve.com/java-memory-model/ 總結: Final 變數在併發當中,原理是通過禁止cpu的指令集重排序(重排序詳解http://ifeve.com/java

java執行與併發程式設計

一、多執行緒1、作業系統有兩個容易混淆的概念,程序和執行緒。程序:一個計算機程式的執行例項,包含了需要執行的指令;有自己的獨立地址空間,包含程式內容和資料;不同程序的地址空間是互相隔離的;程序擁有各種資源和狀態資訊,包括開啟的檔案、子程序和訊號處理。執行緒:表示程式的執行流程

Java執行生產者消費者問題:使用synchronized 關鍵字解決生產者消費者問題

        今天看了一片博文,講Java多執行緒之執行緒的協作,其中作者用程式例項說明了生產者和消費者問題,但我及其他讀者發現程式多跑幾次還是會出現死鎖,百度搜了下大都數的例子也都存在bug,經過仔細研究發現其中的問題,並解決了,感覺有意義貼出來分享下。        

JAVA執行volatile 與 synchronized 的比較

一,volatile關鍵字的可見性 要想理解volatile關鍵字,得先了解下JAVA的記憶體模型,Java記憶體模型的抽象示意圖如下: 從圖中可以看出: ①每個執行緒都有一個自己的本地記憶體空間--執行緒棧空間???執行緒執行時,先把變數從主記憶體讀取到執行緒自己

Java執行執行排程

排程的概念 給定時間結點,時間間隔,任務次數,然後自動執行任務 應用場景舉例 1.日誌清理:每隔三個月,清理公司日誌檔案 2.日誌備份:每個一週,備份公司檔案 3.工資結算:每個月29號,考勤彙報,業務結算,計算工資 排程的實現方式:

java執行3:關鍵字synchronized取得的鎖都是物件鎖,而不是把一段程式碼或者方法(函式)當作鎖

java多執行緒3:關鍵字synchronized取得的鎖都是物件鎖,而不是把一段程式碼或者方法(函式)當作鎖 a.當多個執行緒訪問同一個物件的時候,哪個執行緒先執行帶synchronized關鍵字的方法,哪個執行緒就該方法所屬物件的鎖Lock,那麼其他物件就智慧呈等待狀態。但是如果多個執行緒訪