学习线程范围共享变量,这里为什么是一样的

Charcla 2018-10-24 08:51:11
我这里5个线程,每一个都对a进行了随机赋值,但是输出怎么都是同一个数?
之后把线程改成7以后,6个都是一样的,只有一个不一样

...全文
181 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2018-10-25
  • 打赏
  • 举报
回复
线程同步问题 首先你要知道线程执行的CPU分配是由系统随机分配的(除非调用sleep,wait等等主动让出CPU) 你的1,2,3,4线程执行a = new Random().nextInt(100);后,CPU机让给了线程5,线程5执行a = new Random().nextInt(100);生成随机数84后,CPU又让给了线程1,然后线程1执行System.print,打印出的是线程5生成的随机数84。然后CPU又让给了线程5执行System.print打印,然后又让给线程3,2,4,0执行System.print打印,但是打印还没完成(打印有输出缓存),此时CPU又让给了线程6。线程6由生成了随机数37并执行System.print打印,接着又执行new A().get,打印37,然后CPU让给了线程4,3,0,5,2,1分别执行new A().get,打印37,然后CPU有分给了线程4.3,5,0,1,6,2分别执行new B().get,打印37
qq_39936465 2018-10-25
  • 打赏
  • 举报
回复
共享变量不设置同步,任何情况都可以能发生,因为线程都是在抢占资源运行,过程中出什么情况都有可能。

线程有共享数据的话必须要同步。
nayi_224 2018-10-25
  • 打赏
  • 举报
回复
一样的代码,我是这个结果
package test.gt50;

import java.util.Random;

public class Test58 {
	
	public static int a = 0;
	
	public static void main(String[] args) {
	    for(int i = 0; i <=5; i++){
	    	new Thread(new Runnable() {
				
				@Override
				public void run() {
					// TODO Auto-generated method stub
					a = new Random().nextInt(100);
					System.out.println(Thread.currentThread().getName() + " a = " + a);
					new A().get();
					new B().get();
				}
			}).start();
	    }
	}
	
	
	static class A{
		public int get(){
			System.out.println("aaa asdsfsdf " + a);
			return a;
		}
	}
	
	static class B{
		public int get(){
			System.out.println("bbb asdsfsdf " + a);
			return a;
		}
	}
	
}

Thread-0 a = 53 Thread-4 a = 43 Thread-2 a = 83 aaa asdsfsdf 43 Thread-3 a = 87 aaa asdsfsdf 87 Thread-5 a = 62 aaa asdsfsdf 62 aaa asdsfsdf 62 bbb asdsfsdf 62 bbb asdsfsdf 62 aaa asdsfsdf 43 bbb asdsfsdf 62 bbb asdsfsdf 62 bbb asdsfsdf 62 Thread-1 a = 67 aaa asdsfsdf 67 bbb asdsfsdf 67 也许是你电脑配置太低了吧,创建对象花的时间长了点。
Charcla 2018-10-25
  • 打赏
  • 举报
回复
引用 3 楼 qybao 的回复:
线程同步问题 首先你要知道线程执行的CPU分配是由系统随机分配的(除非调用sleep,wait等等主动让出CPU) 你的1,2,3,4线程执行a = new Random().nextInt(100);后,CPU机让给了线程5,线程5执行a = new Random().nextInt(100);生成随机数84后,CPU又让给了线程1,然后线程1执行System.print,打印出的是线程5生成的随机数84。然后CPU又让给了线程5执行System.print打印,然后又让给线程3,2,4,0执行System.print打印,但是打印还没完成(打印有输出缓存),此时CPU又让给了线程6。线程6由生成了随机数37并执行System.print打印,接着又执行new A().get,打印37,然后CPU让给了线程4,3,0,5,2,1分别执行new A().get,打印37,然后CPU有分给了线程4.3,5,0,1,6,2分别执行new B().get,打印37
对,我就是按照你这样理解的,我把线程数量换成20个以后,顺序终于打乱了

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧