1. 全局變量num=0 兩個線程同時執行以下代碼 { for(int i=0;i<50;i++){ num+=1; } } 最終num值的范圍是什么? 2. 設計一個并發量100左右的系統 從服務器 應用 手段各個角度考慮 第一題應該是 50到100
并發100的話,考慮數據庫連接池,緩存,并發安全上 使用鎖,隊列 4 小時前
引用 + 和 =是兩個操作吧 , 不會有這種情況: 線程1的+操作正在進行, 線程2的循環結束, 線程1才開始執行=操作嗎。
還有int變量如果不加volatile關鍵字, 變量貌似是存放在各自的寄存器緩存里的, 而不一定什么時候才賦值給全局變量。。 有沒有可能發生 線程2num賦值為50 而線程1重新把num變為1呢。。
或者線程2執行到49時, 線程1賦值給全局變量1 , 此時線程2拿到的num又變為1了? 其實差不多就是這樣子的。。。。所以答案應該是50~100 16 分鐘前
用scala寫的,都是用的java的類庫,你改成java代碼就可以了,結果50-100.
- object SzStudy extends App {
- import java.util.LinkedList
- import java.util.concurrent._
- var num = 0
- val pool = Executors.newFixedThreadPool(2)
- val calls = new LinkedList[Callable[Unit]]();
- val call = new Callable[Unit] {
- def call() {
- for (i <- 0 to 49) {
- num += 1
- }
- }
- }
- calls.addLast(call)
- calls.addLast(call)
- val fa = pool.invokeAll(calls)
- val iter=fa.iterator
- //阻塞主線程,等兩個子線程運行完
- while(iter.hasNext){
- iter.next.get()
- }
- println(num)
- }
30 分鐘前
要看主子線程的阻塞程度了。 如zhangzehao 所寫,兩個子線處理速度足夠快,那結構就是100 如果子線程阻塞程度高,主線程沒有阻塞那 也就是0或是1 總所有情況取之范圍應該會在0-100之間
3 小時前
看了回答,同志們真心不看題啊,第一題問num最后的值是多少,不是讓寫程序。 個人感覺是50~100,測實測 第二題:并發量100該如何控控制,求教高手!這個真心不懂 3 小時前
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 小時前
上面那個有點問題,保證線程2先拿到; 這里最后的結果就是1,,但是對于計算機來說 num+=1; 這里執行的時間是一樣多的,所以并不會出現線程1執行完了,線程2才執行了1步這種情況
- static int num =0;
-
- public static void c(){
- Thread t1 = new Thread(){
- @Override
- public void run() {
- try {
- sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- for(int i=0;i<50;i++)
- num+=1;
- }
- };
-
- Thread t2= new Thread(){
- @Override
- public void run() {
- try {
- //線程2先拿到num,然后阻塞住
- sleep(999);
- for(int i=0;i<50;i++){
- int temp = num;
- if(i==0){
- sleep(1000);
- temp+=1;
- num=temp;
- }
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- };
- t1.start();
- t2.start();
- }
- public static void main(String[] args) {
- c();
- try {
- Thread.sleep(4000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(num);
- }
3 小時前
就算阻塞了它還是要循環的啊 線程2這個時間很慢,按照你說的模擬了下
- static int num =0;
-
- public static void c(){
- Thread t1 = new Thread(){
- @Override
- public void run() {
- try {
- sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- for(int i=0;i<50;i++)
- num+=1;
- }
- };
-
- Thread t2= new Thread(){
- @Override
- public void run() {
- try {
- sleep(1000);
- for(int i=0;i<50;i++){
- int temp = num;
- if(i==0){
- sleep(1000);
- temp+=1;
- num=temp;
- }
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- };
- t1.start();
- t2.start();
- }
- public static void main(String[] args) {
- c();
- try {
- Thread.sleep(4000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(num);
- }
3 小時前
http://www.iteye.com/problems/84994
|