導航:首頁 > 編程語言 > java多並發

java多並發

發布時間:2023-01-06 04:36:21

java多線程並發去調用一個類的靜態方法,有什麼問題

總的結論:java是線程安全的,即對任何方法(包括靜態方法)都可以不考慮線程沖突,但有一個前提,就是不能存在全局變數。如果存在全局變數,則需要使用同步機制。x0dx0ax0dx0a如下通過一組對比例子從頭講解:x0dx0a 在多線程中使用靜態方法會發生什麼事?也就是說多線程訪問同一個類的static靜態方法會發生什麼事?是否會發生線程安全問題?x0dx0apublic class Test {x0dx0a public static void operation(){x0dx0a // ... do somethingx0dx0a }x0dx0a}x0dx0a 事實證明只要在靜態函數中沒有處理多線程共享數據,就不存在著多線程訪問同一個靜態方法會出現資源沖突的問題。下面看一個例子:x0dx0apublic class StaticThread implements Runnable {x0dx0a @Overridex0dx0a public void run() {x0dx0a // TODO Auto-generated method stubx0dx0a StaticAction.print();x0dx0a }x0dx0a public static void main(String[] args) {x0dx0a for (int i = 0; i < 100; i++) {x0dx0a new Thread(new StaticThread()).start();x0dx0a }x0dx0a }x0dx0a}x0dx0apublic class StaticAction {x0dx0a public static int i = 0;x0dx0a public static void print() {x0dx0a int sum = 0;x0dx0a for (int i = 0; i < 10; i++) {x0dx0a System.out.print("step " + i + " is running.");x0dx0a sum += i;x0dx0a }x0dx0a if (sum != 45) {x0dx0a System.out.println("Thread error!");x0dx0a System.exit(0);x0dx0a }x0dx0a System.out.println("sum is " + sum);x0dx0a }x0dx0a}x0dx0a 實際執行的結果顯示各個線程對靜態方法的訪問是交叉執行的,但是這並不影響各個線程靜態方法print()中sum值的計算。也就是說,在此過程中沒有使用全局變數的靜態方法在多線程中是安全的,靜態方法是否引起線程安全問題主要看該靜態方法是否對全局變數(靜態變數static member)進行修改操作。x0dx0a 在多線程中使用同一個靜態方法時,每個線程使用各自的實例欄位(instance field)的副本,而共享一個靜態欄位(static field)。所以說,如果該靜態方法不去操作一個靜態成員,只在方法內部使用實例欄位(instance field),不會引起安全性問題。x0dx0a 但是,如果該靜態方法操作了一個靜態變數,則需要靜態方法中採用互斥訪問的方式進行安全處理。我們來看一下沒有使用互斥訪問的話會產生怎樣的問題:public class StaticAction {x0dx0a public static int i = 0;x0dx0a public static void incValue() {x0dx0a int temp = StaticAction.i;x0dx0a try {x0dx0a Thread.sleep(1);x0dx0a } catch (Exception e) {x0dx0a e.printStackTrace();x0dx0a }x0dx0a temp++;x0dx0a StaticAction.i = temp;x0dx0a }x0dx0a}x0dx0apublic class StaticThread implements Runnable {x0dx0a @Overridex0dx0a public void run() {x0dx0a // TODO Auto-generated method stubx0dx0a StaticAction.incValue();x0dx0a }x0dx0a public static void main(String[] args) {x0dx0a for (int i = 0; i < 100; i++) {x0dx0a new Thread(new StaticThread()).start();x0dx0a }x0dx0a try {x0dx0a Thread.sleep(1000); //預留足夠的時間讓上面的線程跑完x0dx0a } catch (Exception e) {x0dx0a e.printStackTrace();x0dx0a }x0dx0a System.out.println(StaticAction.i);x0dx0a }x0dx0a}x0dx0a 實際運行結果顯示i值為隨機的數字。為了實現互斥訪問,這時我們需要加入一個synchronized關鍵字。代碼修改如下:x0dx0apublic class StaticAction {x0dx0a public static int i = 0;x0dx0a public synchronized static void incValue() {x0dx0a int temp = StaticAction.i;x0dx0a try {x0dx0a Thread.sleep(1);x0dx0a } catch (Exception e) {x0dx0a e.printStackTrace();x0dx0a }x0dx0a temp++;x0dx0a StaticAction.i = temp;x0dx0a }x0dx0a}x0dx0apublic class StaticThread implements Runnable {x0dx0a @Overridex0dx0a public void run() {x0dx0a // TODO Auto-generated method stubx0dx0a StaticAction.incValue();x0dx0a }x0dx0a public static void main(String[] args) {x0dx0a for (int i = 0; i < 100; i++) {x0dx0a new Thread(new StaticThread()).start();x0dx0a }x0dx0a try {x0dx0a Thread.sleep(1000);x0dx0a } catch (Exception e) {x0dx0a e.printStackTrace();x0dx0a }x0dx0a System.out.println(StaticAction.i);x0dx0a }x0dx0a}x0dx0a 運行結果則必然是100。x0dx0a 加入synchronized關鍵字的靜態方法稱為同步靜態方法。x0dx0a 在訪問同步靜態方法時,會獲取該類的「Class」對象,所以當一個線程進入同步的靜態方法中時,線程監視器獲取類本身的對象鎖,其它線程不能進入這個類的任何靜態同步方法。它不像實例方法,因為多個線程可以同時訪問不同實例同步實例方法。這個其實就是操作系統中的用信號量實現進程的互斥與同步問題,如果涉及在同一個類中有多個靜態方法中處理多線程共享數據的話,那就變成用信號量解決生產者-消費者問題。也就是說,靜態方法是一份臨界資源,對靜態方法的訪問屬於進入臨界區;對靜態變數的修改是一份臨界資源,對靜態變數的修改屬於進入臨界區。

⑵ java中多線程地並發運行是什麼意思有什麼作用.好處

如果並發的線程數量很多,並且每個線程都是執行一個時間很短的任務就結束了,這樣頻繁創建線程就會大大降低系統的效率,因為頻繁創建線程和銷毀線程需要時間。因此我們可以用多線程處理並發運行,提高資源利用率;
舉例
假如有一個工廠,工廠裡面有10個工人,每個工人同時只能做一件任務。
因此只要當10個工人中有工人是空閑的,來了任務就分配給空閑的工人做;
當10個工人都有任務在做時,如果還來了任務,就把任務進行排隊等待;
如果說新任務數目增長的速度遠遠大於工人做任務的速度,那麼此時工廠主管可能會想補救措施,比如重新招4個臨時工人進來;
然後就將任務也分配給這4個臨時工人做;
如果說著14個工人做任務的速度還是不夠,此時工廠主管可能就要考慮不再接收新的任務或者拋棄前面的一些任務了。
當這14個工人當中有人空閑時,而新任務增長的速度又比較緩慢,工廠主管可能就考慮辭掉4個臨時工了,只保持原來的10個工人,畢竟請額外的工人是要花錢的。

⑶ java多線程並發的問題

回答這個問題需要先弄清楚線程的概念和線程的生命周期。

線程:是指程序代碼的一次執行,是動態的過程。樓主在定義OneTh這個實現Runnable介面類的時候肯定復寫了他的run()方法。onet1和onet2是兩個線程,也就是說雖然他們的run()方法相同,但是是執行了兩次的。

計算機中CPU的調度過程:現在的電腦看上去能同時實現多任務,像是一邊上QQ,一邊聽音樂,還可以一邊上網。但計算機中的CPU只有一個,它沒有分身術,不可能真正意義上實現同時運行這么多程序。而是採用了一種時間片輪轉的方式,為每個應用程序賦予極短的時間,然後高速的在不同的程序間切換,至於每次切換到那個程序,這個要由CPU和線程的優先順序來決定。

線程的生命周期:創建時是初始化了這個線程,調用start方法時,是讓這個線程進入了可運行狀態,注意是可運行,不是正在運行。就像上面說的,在某一時刻CPU具體要運行誰是由CPU和線程的優先順序決定的。當線程被CPU運行時,就會開始執行run方法,但可能執行到一半時,CPU又被其他可運行線程搶走,而只能暫停執行。

JAVA程序線程的運行:在我們使用java命令來運行程序時,這時候已經開始了兩個線程,一個是main()方法的線程,一個是垃圾回收的線程。當樓主調用start方法開啟另外兩個線程時。這時候由於CPU來決定運行哪個線程。所以雖然noet1是先開啟的,但在執行noet1時,CPU可能又去跑去執行main線程了,然後就會開啟onet2.

還有我覺得主線程結束了,只不過其他兩個線程仍在繼續運行。所以會列印出結果。

樓主如果還有什麼不明白的話可以繼續問或者相互討論。

⑷ java 怎樣處理高並發

一、背景綜述

並發就是可以使用多個線程或進程,同時處理(就是並發)不同的操作。

高並發的時候就是有很多用戶在訪問,導致系統數據不正確、糗事數據的現象。對於一些大型網站,比如門戶網站,在面對大量用戶訪問、高並發請求方面,基本的解決方案集中在這樣幾個環節:使用高性能的伺服器、高性能的資料庫、高效率的編程語言、還有高性能的Web容器。這幾個解決思路在一定程度上意味著更大的投入。

使用一般的synchronized或者是lock或者是隊列都是無法滿足高並發的問題。

二、解決方法有三:

1.使用緩存

2.使用生成靜態頁面

html純靜態頁面是效率最高、消耗最小的頁面。我們可以使用信息發布系統來實現簡單的信息錄入自動生成靜態頁面,頻道管理、許可權管理和自動抓取等功能,對於一個大型網站來說,擁有一套高效、可管理的信息發布系統CMS是必不可少的。

3.圖片伺服器分離

圖片是最消耗資源的,僵圖片和頁面分離可以降低提供頁面訪問請求的伺服器系統壓力,並且可以保證系統不會因為圖片問題而崩潰。

3.寫代碼的時候減少不必要的資源浪費:

⑸ java中如何實現多進程並發

創建多個線程就可以了,最長用的方法有:

  1. 創建類,實現Runnable 介面,重寫run方法;

  2. 繼承Thread 類,重寫run方法。

  3. 使用線程池。

  4. 具體比較麻煩,你查api

  5. 給你一個簡單的例子看看。

  6. package DuoXianCheng;


  7. public class ThreadText {

  8. public static void main(String[] args) throws Exception {

  9. Runnable rb=new ThreadText().new Thread2();

  10. Thread t3=new Thread(rb,"旺財");

  11. Thread t1=new Thread(rb,"小強");

  12. t1.start();

  13. t3.start();


  14. }

  15. public class Thread2 implements Runnable{

  16. public void run(){

  17. while(true){

  18. try {

  19. Thread.sleep(2000);

  20. System.out.println("當前線程名稱:"+Thread.currentThread().getName()+"*****");

  21. } catch (InterruptedException e) {

  22. e.printStackTrace();

  23. }

  24. }

  25. }

  26. };

  27. }

⑹ java高並發,如何解決,什麼方式解決,高並發

首先,為防止高並發帶來的系統壓力,或者高並發帶來的系統處理異常,數據紊亂,可以以下幾方面考慮:1、加鎖,這里的加鎖不是指加java的多線程的鎖,是指加應用所和資料庫鎖,應用鎖這邊通常是使用redis的setnx來做,其次加資料庫鎖,因為代碼中加了應用所,所以資料庫不建議加悲觀鎖(排他鎖),一般加樂觀鎖(通過設置一個seq_no來解決),這兩個鎖一般能解決了,最後做合理的流控,丟棄一部分請求也是必不可少的

⑺ java如何處理高並發

你指的高並發量大概有多少?x0dx0a幾點需要注意:x0dx0a盡量使用緩存,包括用戶緩存,信息緩存等,多花點內存來做緩存,可以大量減少與資料庫的交互,提高性能。x0dx0a用jprofiler等工具找出性能瓶頸,減少額外的開銷。x0dx0a優化資料庫查詢語句,減少直接使用hibernate等工具的直接生成語句(僅耗時較長的查詢做優化)。x0dx0a優化資料庫結構,多做索引,提高查詢效率。x0dx0a統計的功能盡量做緩存,或按每天一統計或定時統計相關報表,避免需要時進行統計的功能。x0dx0ax0dx0a能使用靜態頁面的地方盡量使用,減少容器的解析(盡量將動態內容生成靜態html來顯示)。x0dx0a解決以上問題後,使用伺服器集群來解決單台的瓶頸問題。x0dx0a基本上以上述問題解決後,達到系統最優。x0dx0ax0dx0a至於樓上有人提到別用JAVA來做,除非是低層的連接數過大(如大量的埠佔用需求),這種情況下考慮直接C來寫,其他的可以用JAVA來做。x0dx0ax0dx0a可以網上購買視頻做教育學習。

⑻ 什麼被稱為Java的並發

java什麼是並發?一起來來了解一下吧。
在Java中,同時執行多個操作的「思想」稱為並發,並發完成的每一件事稱為線程,java是一種多線程編程語言,一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務。
拓展:Java需要學習什麼?
1、對Java有基本認知。
2、學習Java基礎:包括Java語言、Java語法和各種基本演算法,了解代碼從寫好到實現之間的流程。
2、資料庫開發:主要包括SQL基礎、JDBC編程和JDBC高級應用。
3、DHTML編程:主要包括HTML語言、JS語法、JS對象和DOM編程。
4、Javaweb編程:主要包括servlet開發、JSP開發和AJAX開發。
5、學習真實實訓項目,培養實操能力。
今天的分享就是這些了,希望大家喜歡。

⑼ java多線程並發問題怎麼解決

java多線程並發問題產生的主要原因是多個線程訪問一個實例,導致其中一個線程修改或刪除這個實例時,其他線程產生並發問題。

要解決這種並發問題有兩種方法:
(1)加上線程鎖synchronization
(2)還有個不是辦法的辦法:不用成員變數,用局部變數

閱讀全文

與java多並發相關的資料

熱點內容
h3c光纖全工半全工設置命令 瀏覽:135
公司法pdf下載 瀏覽:379
linuxmarkdown 瀏覽:347
華為手機怎麼多選文件夾 瀏覽:679
如何取消命令方塊指令 瀏覽:345
風翼app為什麼進不去了 瀏覽:774
im4java壓縮圖片 瀏覽:358
數據查詢網站源碼 瀏覽:146
伊克塞爾文檔怎麼進行加密 瀏覽:886
app轉賬是什麼 瀏覽:159
php的基本語法 瀏覽:792
對外漢語pdf 瀏覽:516
如何用mamp本地web伺服器 瀏覽:869
如何加密自己js代碼 瀏覽:627
排列組合a與c的演算法 瀏覽:534
如何在文件夾中找到同名內容 瀏覽:786
有什麼app文字轉韓文配音 瀏覽:372
循環宏1命令 瀏覽:35
斐波那契數列矩陣演算法 瀏覽:674
公式保護後加密不了 瀏覽:82