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
|