少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
          1. 全局變量num=0 
            兩個線程同時執行以下代碼 
            { 
               for(int i=0;i<50;i++){ 
                  num+=1; 
               } 
             } 
              
            最終num值的范圍是什么? 


          2. 設計一個并發量100左右的系統 從服務器 應用 手段各個角度考慮  


          10

          第一題應該是 
          50到100 

          并發100的話,考慮數據庫連接池,緩存,并發安全上 使用鎖,隊列

          4 小時前
          kidding87kidding87 
          1358 
          0 0 8
          00

          引用
          + 和 =是兩個操作吧 , 不會有這種情況: 線程1的+操作正在進行, 線程2的循環結束, 線程1才開始執行=操作嗎。  

          還有int變量如果不加volatile關鍵字, 變量貌似是存放在各自的寄存器緩存里的, 而不一定什么時候才賦值給全局變量。。 有沒有可能發生 線程2num賦值為50 而線程1重新把num變為1呢。。 

          或者線程2執行到49時, 線程1賦值給全局變量1 , 此時線程2拿到的num又變為1了?
          其實差不多就是這樣子的。。。。所以答案應該是50~100 

          16 分鐘前
          asytyasyty 
          1434 
          0 0 10
          00

          用scala寫的,都是用的java的類庫,你改成java代碼就可以了,結果50-100. 

          Scala代碼  收藏代碼
          1. object SzStudy extends App {  
          2.   import java.util.LinkedList  
          3.   import java.util.concurrent._  
          4.   var num = 0  
          5.   val pool = Executors.newFixedThreadPool(2)  
          6.   val calls = new LinkedList[Callable[Unit]]();  
          7.   val call = new Callable[Unit] {  
          8.     def call() {  
          9.       for (i <- 0 to 49) {  
          10.         num += 1  
          11.       }  
          12.     }  
          13.   }  
          14.   calls.addLast(call)  
          15.   calls.addLast(call)  
          16.   val fa = pool.invokeAll(calls)  
          17.   val iter=fa.iterator  
          18.   //阻塞主線程,等兩個子線程運行完  
          19.   while(iter.hasNext){  
          20.     iter.next.get()  
          21.   }  
          22.   println(num)  
          23. }  

          30 分鐘前
          tlde_titlde_ti 
          16 
          0 0 1
          00

          要看主子線程的阻塞程度了。 
          如zhangzehao 所寫,兩個子線處理速度足夠快,那結構就是100 
          如果子線程阻塞程度高,主線程沒有阻塞那 也就是0或是1 
          總所有情況取之范圍應該會在0-100之間 

          3 小時前
          zhaoshunxinzhaoshunxin 
          202 
          0 0 1
          00

          看了回答,同志們真心不看題啊,第一題問num最后的值是多少,不是讓寫程序。 
          個人感覺是50~100,測實測 
          第二題:并發量100該如何控控制,求教高手!這個真心不懂

          3 小時前
          chairmanMaochairmanMao 
          12 
          0 0 4
          00

          public static void main(String[] args){ 

          Thread thread1 = new Thread(new Runnable() { 
          @Override 
          public void run() { 
          for(int i=0;i<50;i++){ 
          num++; 
          System.out.println(num); 


          }); 

          Thread thread2 = new Thread(new Runnable() { 
          @Override 
          public void run() { 
          for(int i=0;i<50;i++){ 
          num++; 
          System.out.println(num); 


          }); 

          thread1.start(); 
          thread2.start(); 
          }

          3 小時前
          zhangzehaozhangzehao 
          30 
          0 0 0
          00

          上面那個有點問題,保證線程2先拿到; 
          這里最后的結果就是1,,但是對于計算機來說 
          num+=1; 這里執行的時間是一樣多的,所以并不會出現線程1執行完了,線程2才執行了1步這種情況 

          Java代碼  收藏代碼
          1. static  int num =0;  
          2.   
          3. public static void c(){  
          4.     Thread t1 = new Thread(){  
          5.         @Override  
          6.         public void run() {  
          7.             try {  
          8.                 sleep(1000);  
          9.             } catch (InterruptedException e) {  
          10.                 e.printStackTrace();  
          11.             }  
          12.             for(int i=0;i<50;i++)  
          13.             num+=1;  
          14.         }  
          15.     };  
          16.       
          17.    Thread t2=   new Thread(){  
          18.         @Override  
          19.         public void run() {  
          20.             try {  
          21.                                       //線程2先拿到num,然后阻塞住  
          22.                 sleep(999);  
          23.             for(int i=0;i<50;i++){  
          24.                     int temp = num;  
          25.                     if(i==0){  
          26.                         sleep(1000);  
          27.                         temp+=1;  
          28.                         num=temp;  
          29.                     }  
          30.             }  
          31.             } catch (InterruptedException e) {  
          32.                 e.printStackTrace();  
          33.             }  
          34.         }  
          35.     };  
          36.     t1.start();  
          37.     t2.start();  
          38. }  
          39. public static void main(String[] args) {  
          40.     c();  
          41.     try {  
          42.         Thread.sleep(4000);  
          43.     } catch (InterruptedException e) {  
          44.         e.printStackTrace();  
          45.     }  
          46.     System.out.println(num);  
          47. }  

          3 小時前
          kidding87kidding87 
          1358 
          0 0 8
          00

          就算阻塞了它還是要循環的啊 
          線程2這個時間很慢,按照你說的模擬了下 

          Java代碼  收藏代碼
          1. static  int num =0;  
          2.   
          3. public static void c(){  
          4.     Thread t1 = new Thread(){  
          5.         @Override  
          6.         public void run() {  
          7.             try {  
          8.                 sleep(1000);  
          9.             } catch (InterruptedException e) {  
          10.                 e.printStackTrace();  
          11.             }  
          12.             for(int i=0;i<50;i++)  
          13.             num+=1;  
          14.         }  
          15.     };  
          16.       
          17.    Thread t2=   new Thread(){  
          18.         @Override  
          19.         public void run() {  
          20.             try {  
          21.                 sleep(1000);  
          22.             for(int i=0;i<50;i++){  
          23.                     int temp = num;  
          24.                     if(i==0){  
          25.                         sleep(1000);  
          26.                         temp+=1;  
          27.                         num=temp;  
          28.                     }  
          29.             }  
          30.             } catch (InterruptedException e) {  
          31.                 e.printStackTrace();  
          32.             }  
          33.         }  
          34.     };  
          35.     t1.start();  
          36.     t2.start();  
          37. }  
          38. public static void main(String[] args) {  
          39.     c();  
          40.     try {  
          41.         Thread.sleep(4000);  
          42.     } catch (InterruptedException e) {  
          43.         e.printStackTrace();  
          44.     }  
          45.     System.out.println(num);  
          46. }  

          3 小時前
          kidding87kidding87 
          1358 
          0 0 8
          00

          tomcat 本身 默認支持的并發為200.配和連接池,完全給解決 第一個 50
























          http://www.iteye.com/problems/84994 
























          http://www.iteye.com/problems/84994 
          posted on 2012-06-21 13:23 abin 閱讀(521) 評論(0)  編輯  收藏 所屬分類: Java Face

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 揭西县| 和平区| 富阳市| 安新县| 保德县| 新宁县| 都江堰市| 汾西县| 宜都市| 中宁县| 万山特区| 新河县| 长岛县| 桂东县| 清新县| 万州区| 河源市| 苍山县| 北海市| 田林县| 淮滨县| 甘南县| 温泉县| 得荣县| 东明县| 英吉沙县| 乡城县| 遂平县| 曲松县| 衡阳县| 伊吾县| 闽侯县| 手游| 嘉荫县| 柘城县| 资兴市| 武胜县| 吴旗县| 岐山县| 伊宁县| 昂仁县|