Java-多线程中java对象怎样管理的?
public class Count {
private int num;
public void count(){
for(int i=0;i<=10;i++){
num += i;
}
System.out.println(Thread.currentThread().getName()+"--"+num);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这里改写了下代码,主要看注释。
package com.ybl.test.test;
public class Count {
private int num;
private static long t1 = 0;
private int count = 0; // 统计执行的次数
public void count() {
// 可以使用同步锁,看执行的次数之类
// public synchronized void count() {
// 如果想看更好的效果,或者说更差的效果,就创建一个temp1,然后改值
int temp1 = 10000;
for (int i = 0; i <= temp1; i++) {
num += i;
//
t1 += i;
count++;
}
System.out.println(Thread.currentThread().getName() + "__" + num + "__"
+ "常量:" + t1 + "__" + count + "次");
}
}
package com.ybl.test.test;
public class RunnableTest1 implements Runnable {
// 这里直接实例化了对象。
// 如果只实例化一次RunnableTest1类,那么只有一个Count对象
private Count count = new Count();
public void run() {
count.count();
}
}
package com.ybl.test.test;
public class TestThread {
public static void main(String[] args) {
// 改写后的写法
// 这里指实例化一个RunnableTest1对象,所以只存在一个RunnableTest1对象,一个Count对象。
// cpu会以一种类似于公平的方式去执行线程,也就是说cpu会随机的给处于runnable状态下的线程分配时间段,
// 时间段很短的,尽量做到每个线程做一下动作,假如有(a,b,c)3个线程,jvm先会让a线程动一下,然后会让b动一下,下面是c动一下,尽量做到a>b>c这样的循环动作,
// 可能做不到绝对控制,也可能有其他的原因,所以并不会按照想象中的去执行线程。
// 一个线程执行完后,又会回到runnable状态,继续等待cpu分配时间段。
RunnableTest1 run1 = new RunnableTest1();
for (int i = 0; i < 10; i++) {
new Thread(run1).start();
}
// 本人其实也是菜鸟,说错的地方,请指正。
// 和cpu有关系的,多线程弄不好,会造成数据错误,效率低下等问题,请保重。
// 我对java底层也不了解。
// 如果代码写的复杂,可以拆分,弄简单点。
}
}
程序里面只有一个Runnable对象,就是在main线程中声明的那个runnable
你新建了10个线程(Thread-0...9),每个线程都引用了同一个runnable,这是会导致资源抢占,使runnable对象状态不稳定。
这个输出顺序不一定是固定的,在相同的机器上,多运行几次,或者在不同的jvm下,不同的平台下,
都会有不同的输出顺序
取决于jvm的调度.
简单的说,就是一个实例,进行了10次调用,把main class改成下面的代码,你就会看到顺序的输出:
public class TT {
public static void main(String[] args) {
Count count = new Count();
for(int i = 0; i < 10; i++) {
count.count();
}
}
}
把Count count = new Count();
放到一个runable里,唯一的变化就是每一次Count调用的顺序不是固定的了,
是由jvm调度了.
这个runable对象在JVM的内存管理里,只在堆内存中存在一个,然后在循环中被引用了10次,
而且这10次的执行顺序是不固定的.
仅此而已.
Runnable和Thread两种实现多线程的方式,数据的结果是不同的。原因是Runnable中多个线程共享target对象,也就是num对象。如果用Thread就会是两种不同的结果,楼主可以尝试一下。