當前位置:首頁 » 編程語言 » java線程共享變數

java線程共享變數

發布時間: 2022-05-24 00:13:01

A. java中怎麼把一個線程裡面的變數傳到另一個線程

把這個變數定義提取到線程外部, 線程通過引用持有這個變數, 這樣就可以實現變數的共享, 這個時候就要注意線程同步的問題.

B. java多線程共享變數

兩個線程同時獲取變數,
獲取之後.第一個線程++操作,然後進入睡眠.
這時,第二個線程,也獲取到了,做--操作.睡眠.
第一個線程醒來列印的是做過2次運算的數據(++,--)所以是0
第二線程也一樣.
這涉及到多線程安全問題.

C. Java編程多個線程如何訪問同一個共享資源

如果該方法不涉及寫公共的資源比如一個靜態的變數或者寫文件,修改某個資料庫的值的時候沒有影響
比如你這個類里的方法只是對輸入的參數做一個計算然後返回計算的值就沒有影響。
但是如果是修改公共的資源比如修改資料庫中存儲的一個value則有可能出現問題,如:

public void writeDb(String key, String value) {
collectiondb();
write(key, value);
closeDbCollection();
}

因為Java的線程運行順序是不一定的,可以第一個線程運行完連接資料庫到後掛起了,這時候第二個線程開始運行,如果你的collectiondb()處理使用的是類中的一個實例變數Connection conn來保存資料庫的連接,當第二個線程運行完畢以後conn也被關閉了,第一個線程繼續執行write函數寫資料庫值的時候就會拋出異常。
這是一個例子,還有其他可能產生臟數據的問題
多線程如果使用公共資源的話最好在方法上聲明synchronized關鍵字讓其同步

D. 多個線程共享變數的例子,線程為什麼要Threa

問題提的很好,搜了一把終於知道了大概的原因,首先糾正提問者的提問,貼出來的第一段代碼屬於匿名內部類,第二端代碼不屬於匿名內部類。

回答你的問題,為什麼在匿名內部類中引用外部對象要加final修飾符呢,因為,在匿名內部類中引用的外部對象受到外部線程的作用域的制約有其特定的生命周期,以線程為例,當外部的變數生命周期已經完結之後,內部的線程還在運行,怎麼樣解決這個外部生命周期已經結束而在內部卻需要繼續使用呢,這個時候就需要在外部變數中添加final修飾符,其實內部匿名類使用的這個變數就是外部變數的一個「復製品」,即使外部變數生命周期已經結束,內部的「復製品「依然可用。

網路搜索的答案如下:
為什麼匿名內部類參數必須為final類型
1) 從程序設計語言的理論上:局部內部類(即:定義在方法中的內部類),由於本身就是在方法內部(可出現在形式參數定義處或者方法體處),因而訪問方法中的局部變數(形式參數或局部變數)是天經地義的.是很自然的
2) 為什麼JAVA中要加上一條限制:只能訪問final型的局部變數?
3) JAVA語言的編譯程序的設計者當然全實現:局部內部類能訪問方法中的所有的局部變數(因為:從理論上這是很自然的要求),但是:編譯技術是無法實現的或代價極高.
4) 困難在何處?到底難在哪兒?
局部變數的生命周期與局部內部類的對象的生命周期的不一致性!
5) 設方法f被調用,從而在它的調用棧中生成了變數i,此時產生了一個局部內部類對象inner_object,它訪問了該局部變數i .當方法f()運行結束後,局部變數i就已死亡了,不存在了.但:局部內部類對象inner_object還可能 一直存在(只能沒有人再引用該對象時,它才會死亡),它不會隨著方法f()運行結束死亡.這時:出現了一個"荒唐"結果:局部內部類對象 inner_object要訪問一個已不存在的局部變數i!
6) 如何才能實現?當變數是final時,通過將final局部變數"復制"一份,復製品直接作為局部內部中的數據成員.這樣:當局部內部類訪問局部變數 時,其實真正訪問的是這個局部變數的"復製品"(即:這個復製品就代表了那個局部變數).因此:當運行棧中的真正的局部變數死亡時,局部內部類對象仍可以 訪問局部變數(其實訪問的是"復製品"),給人的感覺:好像是局部變數的"生命期"延長了.
那麼:核心的問題是:怎麼才能使得:訪問"復製品"與訪問真正的原始的局部變數,其語義效果是一樣的呢?
當變數是final時,若是基本數據類型,由於其值不變,因而:其復製品與原始的量是一樣.語義效果相同.(若:不是final,就無法保證:復製品與原始變數保持一致了,因為:在方法中改的是原始變數,而局部內部類中改的是復製品)

當 變數是final時,若是引用類型,由於其引用值不變(即:永遠指向同一個對象),因而:其復製品與原始的引用變數一樣,永遠指向同一個對象(由於是 final,從而保證:只能指向這個對象,再不能指向其它對象),達到:局部內部類中訪問的復製品與方法代碼中訪問的原始對象,永遠都是同一個即:語義效 果是一樣的.否則:當方法中改原始變數,而局部內部類中改復製品時,就無法保證:復製品與原始變數保持一致了(因此:它們原本就應該是同一個變數.)

一句話:這個規定是一種無可奈何.也說明:程序設計語言的設計是受到實現技術的限制的.這就是一例. 因為:我就看到不少人都持這種觀點:設計與想法是最重要的,實現的技術是無關緊要的,只要你作出設計與規定,都能實現.

E. Java類的實例化順序是什麼樣的Java線程同步的方式有哪些

引言:java是在1990年初 ,被詹姆斯•高斯林等人開發的一門面向對象的編程語言。起初,java被稱為0ak,來經過發展0ak改名為java,與1995年的五月份正式向大家發布。

一、java類的實例化順序

java的實例化順序在繼承沒有的情況

單獨一個類的場景下,初始化順序為依次為靜態數據,繼承的基類的構造函數,成員變數,被調用的構造函數。

其中靜態數據只會初始化一次。(靜態數據包括靜態代碼塊和靜態變數,每個類的靜態數據只會初始化一次)

在繼承的情況下

添加兩個基類,讓繼承父親,父親繼承祖父。

繼承的情況就比較復雜了。由繼承了基類,還將往上回溯,遞歸地調用基類的無參構造方法。

在我們的例子中,在初始化靜態數據後,會先往上追溯,調用父的默認構造方法,此時再往上追溯到爺爺的默認構造方法。


無論是java還是什麼別的東西他都體現了現代社會與信息技術的不斷發展,人們在進行進行技術開發時也有了越來越多的方法。程序類的工作也有了更為快捷的方法,這為信息技術的發展也提供了更好的發展方法

F. 如何實現java線程間

線程間的通信方式
同步
這里講的同步是指多個線程通過synchronized關鍵字這種方式來實現線程間的通信。
參考示例:
public class MyObject {
synchronized public void methodA() {
//do something....
}
synchronized public void methodB() {
//do some other thing
}
}
public class ThreadA extends Thread {
private MyObject object;
//省略構造方法
@Override
public void run() {
super.run();
object.methodA();
}
}
public class ThreadB extends Thread {
private MyObject object;
//省略構造方法
@Override
public void run() {
super.run();
object.methodB();
}
}
public class Run {
public static void main(String[] args) {
MyObject object = new MyObject();
//線程A與線程B 持有的是同一個對象:object
ThreadA a = new ThreadA(object);
ThreadB b = new ThreadB(object);
a.start();
b.start();
}
}
由於線程A和線程B持有同一個MyObject類的對象object,盡管這兩個線程需要調用不同的方法,但是它們是同步執行的,比如:線程B需要等待線程A執行完了methodA()方法之後,它才能執行methodB()方法。這樣,線程A和線程B就實現了 通信。
這種方式,本質上就是「共享內存」式的通信。多個線程需要訪問同一個共享變數,誰拿到了鎖(獲得了訪問許可權),誰就可以執行。

G. java多線程中,共享數據變數 為什麼一定要定義private許可權

java是面向對象語言,一切成員都會封裝在一個類中,定義成private是為了更好地隱藏,對外暴露的是setter和getter方法,所以可以通過setter設置值,getter來取值,達到模塊隱藏的目的。

H. 請教JAVA怎麼編寫多線程共享一個變數

多線程要麼集成Thread類 要麼實現Runnable 介面 入口都是public void run(){} 如果需要一個完善的可以做一個線程池.

I. java中多個線程訪問共享數據的方式有哪些

多個線程對共同數據的訪問的實現,要根據情況而定 (1)當訪問共同的代碼的時候:可以使用同一個Runnable對象,這個Runnable對象中有這個共享數據,比如賣票系統就可以這么做。或者這個共享數據封裝在一個對象當中,然後對這個對象加鎖,也可以實現數據安全訪問。 (2)當各個線程訪問的代碼不同時:這時候要使用不同的Runnable對象,有兩種實現方式: a)將共享數據封裝在另一個對象當中,然後將這個對象逐一的轉遞給各個Runnable對象。操作數據的方法也放進這個對象當中。這樣容易實現各個線程對這個數據的同步和共享。 b)將Runnable對象作為某一個類中的內部類,共享數據作為這個外部類的成員變數,每個線程對共享數據的訪問也交給外部類的方法,比便對共享數據的互斥和通信。Runnable對象調用外部類的操作這個共享數據的方法。 還有一種方式是a)和b)的結合實現,把共享數據封裝到一個對象當中去,這個對象也實現對這個共享數據的操作,這個對象作為外部類的成員變數。然後再創建多個Runnable對象做為內部類,操作這個對象。 總結:對於要是下同步互斥的代碼要放在不同的方法中,並且放在同一個對象當中,容易實現互斥和通信,並且也有利於日後的維護。這樣思路也很清晰。 如有不妥之處,敬請指正。

熱點內容
腳本師傳奇 發布:2025-02-13 14:45:48 瀏覽:480
我的世界lce伺服器剪輯 發布:2025-02-13 14:40:50 瀏覽:624
phpsftp上傳 發布:2025-02-13 14:35:43 瀏覽:273
c學生管理系統資料庫 發布:2025-02-13 14:21:41 瀏覽:122
傳奇添加會員腳本 發布:2025-02-13 14:20:50 瀏覽:205
微信開發平台源碼 發布:2025-02-13 14:14:20 瀏覽:613
安卓大屏屏幕休眠是什麼意思 發布:2025-02-13 14:13:28 瀏覽:464
腳本的參數設置 發布:2025-02-13 14:11:57 瀏覽:863
androidtexture 發布:2025-02-13 14:11:57 瀏覽:393
怎麼取消網路密碼怎麼設置 發布:2025-02-13 14:11:54 瀏覽:426