兩個線程同時執行以下代碼
{
for(int i=0;i<50;i++){
num+=1;
}
}
最終num值的范圍是什么?
2. 設計一個并發量100左右的系統 從服務器 應用 手段各個角度考慮
- 引用+ 和 =是兩個操作吧 , 不會有這種情況: 線程1的+操作正在進行, 線程2的循環結束, 線程1才開始執行=操作嗎。其實差不多就是這樣子的。。。。所以答案應該是50~100
還有int變量如果不加volatile關鍵字, 變量貌似是存放在各自的寄存器緩存里的, 而不一定什么時候才賦值給全局變量。。 有沒有可能發生 線程2num賦值為50 而線程1重新把num變為1呢。。
或者線程2執行到49時, 線程1賦值給全局變量1 , 此時線程2拿到的num又變為1了?16 分鐘前
用scala寫的,都是用的java的類庫,你改成java代碼就可以了,結果50-100.
Scala代碼- 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步這種情況Java代碼- 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這個時間很慢,按照你說的模擬了下Java代碼- 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 小時前
tomcat 本身 默認支持的并發為200.配和連接池,完全給解決 第一個 50
http://www.iteye.com/problems/84994
http://www.iteye.com/problems/84994