1. 程式人生 > >多執行緒臨界資源問題

多執行緒臨界資源問題

package com.hbsi;
public class DeadLock {

 /**
  * @param args
  */
 public static void main(String[] args) {
  Demo6 d1=new Demo6(true);
  Demo6 d2=new Demo6(false);
  Thread t1=new Thread(d1);
  Thread t2=new Thread(d2);
  t1.start();
  t2.start();
 }
}

class MyLock{
 static MyLock lock1=new MyLock();
 static MyLock lock2=new MyLock();
}

class Demo6 implements Runnable{
 //String str1=new String("aaa");
 //String str2=new String("bbb");
 
 private boolean flag;
 public Demo6(boolean flag){
  this.flag=flag;
 }

 @Override
 public void run() {
  if(flag){
   synchronized(MyLock.lock1){
    System.out.println(Thread.currentThread().getName()+"...if...str1"); 
    
    synchronized(MyLock.lock2){
     System.out.println(Thread.currentThread().getName()+"...if...str2");
     
    }
   }
   
   
  }else{
          synchronized(MyLock.lock2){
           System.out.println(Thread.currentThread().getName()+"...else...str2");
          
     synchronized(MyLock.lock1){
     System.out.println(Thread.currentThread().getName()+"...else...str1");
    }
   }
  }
  
 }
 
}

 小總結:Synchronization關鍵字是一個修飾符,可以修飾方法或程式碼塊。其作用就是:對於同一個物件(不是一個類的不同物件),當多個執行緒都同時呼叫該方法或程式碼塊時,必須依次執行,也就是說,如果兩個或兩個以上的執行緒同時執行該段程式碼,如果一個執行緒已經開始執行該段程式碼,則另一個執行緒必須等待這個執行緒執行完這段程式碼才能開始執行。

相關推薦

QT執行臨界資源互斥

多執行緒是個老梗,一般都會遇到,同樣臨界資源的互斥訪問也是一個老生長談的問題了。這裡把最近使用的一種方法分享一下。 問題場景:主執行緒根據一定條件建立多個子執行緒,子執行緒執行的是同一個類不同例項的方法,該方法中需要向主執行緒傳送一個訊息顯示一個對話方塊用以接收使用者輸入;

執行臨界資源問題

package com.hbsi;public class DeadLock { /**  * @param args  */ public static void main(String[] args) {  Demo6 d1=new Demo6(true);  Demo6 d2=new Demo6(fal

[作業系統]Windows環境下的執行臨界資源訪問

目錄                     SetEvent/ResetEvent                      ReleaseMutex DWORD WaitForSingleObject( HANDLE THandle, DWORD T

執行學習資源連結

多執行緒 https://blog.csdn.net/fang323619/article/details/73904351 https://blog.csdn.net/Evankaka/article/details/44153709 https://blog.csdn.net/mai

執行共享資源

多執行緒共享資源 按照作業系統原理,程序是系統資源分配的最小單位,執行緒是cpu排程的最小單位。執行緒共享程序申請的資源,但是執行緒有維持自己正常執行的很小的資源,這很小的資源為各個執行緒獨有。 同一個程序中建立的多執行緒共享的環境包括: 程序程式碼段 程序的公有資

linux下一個程序中執行資源共享

在說執行緒資源共享之前,我們先來說來說一下執行緒的概念,執行緒是程序內部的一條執行序列(即執行流),一個程序至少有一個執行緒,即main函式代表的執行流。當然我們也可以通過執行緒庫來建立新的執行緒,這種執行緒我們稱之為函式執行緒,同一個程序中的所有普執行緒是併發執行的。而這些

兩種方式實現執行共享資源(典型的售票例子)

1、繼承Thread TestThread類 public class TestThread extends Thread{ private int ticket = 300; @Override public void run() { while(true){

執行 共享資源 同步鎖 java Java執行程式設計:Lock

Java多執行緒程式設計:Lock   synchronized是java中的一個關鍵字,也就是說是Java語言內建的特性。那麼為什麼會出現Lock呢?   如果一個程式碼塊被synchronized修飾了,當一個執行緒獲取了對應的鎖,並執行該程式碼塊時,其他執行緒便只

執行臨界區問題及解決方法

臨界區定義:函式內同時執行多個執行緒時引起的,由多條語句構成的程式碼塊。 當多個執行緒對同一塊記憶體空間進行操作時,就有可能產生臨界區問題。 下面先看一個例子: #include <stdio.h> #include <unistd.

ThreadLocal:執行共享資源安全訪問新思路

ThreadLocal是解決執行緒安全問題一個很好的思路,ThreadLocal類中有一個Map,用於儲存每一個執行緒的變數副本,Map中元素的鍵為執行緒物件,而值對應執行緒的變數副本,由於Key值不可重複,每一個“執行緒物件”對應執行緒的“變數副本”,從而保證了執行緒安全

C語言 執行臨界資源--critical section

簡介: 不論是硬體臨界資源,還是軟體臨界資源,多個執行緒必須互斥地對它進行訪問。 每個執行緒中訪問臨界資源的那段程式稱為臨界區(Critical Section)(臨界資源是一次僅允許一個執行緒使用的

傻瓜式的解答:為什麼原子運算 AtomicInteger 可以解決執行計算臨界資源錯誤

/* 為什麼多執行緒計算臨界資源會錯誤? 原貼:https://www.cnblogs.com/wxd0108/p/5479442.html 答:多執行緒的記憶體模型分【主存】和【執行緒棧】,在處理資料時,執行緒會把值從主存load到本地棧,完成操作後再s

C++執行臨界資源例項

在C++中引入thread標頭檔案可以很容易地實現多執行緒。 #include <thread> 引入標頭檔案後,我們需要將每一個執行緒寫成函式的形式。如示例中的inc()與dec()函式。 void inc() { int t

Java之執行安全(屌絲版,兩大解決思路,要麼不去競爭(開闢執行副本)、要麼有順序的競爭資源(用鎖規定執行秩序))

0、多執行緒安全,如果多個執行緒操作一個變數,每次都能達到預期的結果,那麼說明當前這個類起碼是執行緒安全的,我這白話的,可能有點噁心。   1、看看牛人是怎麼說的,為什麼多執行緒併發是不安全的? 在作業系統中,執行緒是不再擁有資源的,程序是擁有資源的。而執行緒是由程序建立的

Java執行與鎖模型-順序鎖與資源

順序鎖:當應用程式使用2把以上的鎖時,就容易出現因為多執行緒獲取鎖的順序不同而死鎖的情形,包括交叉獲取應用程式範圍內的多把已知鎖、交叉獲取應用程式與第三方方法中的多把鎖而造成的順序死鎖。絕大多數死鎖都是因為CPU排程多執行緒時,在執行時序上是交叉進行的而造成亂序獲得多把鎖,從

C++執行--執行同步臨界

1、執行緒同步 執行緒同步是指執行緒之間所具有的一種制約關係,一個執行緒的執行依賴另一個執行緒的訊息,當它沒有得到另一個執行緒的訊息時應等待,直到訊息到達時才被喚醒。 3、執行緒同步的方法 (1)臨界區 (2)訊號量 (3)互斥量 (4)事件 4、臨界區 (1

執行時的資料庫連線資源佔用問題

MICROSOFTSPEECHPLATFORM11WITHOUTTHEMOSTIMPORTANTDLLMICROSOFTSPEECHPLATFORM11WITHOUTTHEMOSTIMPORTANTDLLMICROSOFTSPEECHPLATFORM11WITHOUTTHEM

C# 執行資源克隆解決方式及其應用

背景:多執行緒中的共享資源處理常用的方法是加鎖,但是加鎖是的任務處理由並行處理程式設計了序列處理大大降低了多執行緒的效率,這裡介紹另一種處理多執行緒共享資源的處理方式克隆,介紹在C#中克隆解決多執行緒問題的示例和其他開源框架中使用這種思想實現的一些功能,歡迎大家留言交流。

[C#原始碼]網路資料流讀寫封裝類,支援執行下同時讀和寫,自動資源管理,字串分隔符\r\n

using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using Syst

執行互斥訪問資源的Demo

這個程式因為把執行緒的建立寫在了建構函式裡,不用顯式啟動執行緒,也因此有些臃腫。 #include <iostream> #include <stdlib.h> #include <thread> #include <mutex> #include