日期:2014-05-20  浏览次数:20727 次

弄的我茶饭不思的多线程理解!
有一个问题,我一直很迷茫!希望大哥大姐仔细看完,帮我理透一下多线程的思路
  如:有一个类Test,没有成员变量,就只有一些静态方法
 
Java code

public class Test {

    public static void test(int i,int j){
                /*
                 *这里是自己写的一些业务,做了一些逻辑操作,处理一些数据
                 *
                 /
        System.out.println(i+j);
    }
}


这个类会同时被多个线程用Test.test()方法同时调用,那假设两个线程同时刚好把这个方法运行完,我想问问这两个线程做的一些数据处理会不会混淆在一起,产生出错乱的结果,方法有static关键字和没有static 关键字的时候对多线程运行有没有影响?
我自己理解:static修饰的方法是属于某一个类,属于多个对象共用,而假设多个线程同时调用这个类的这个静态方法时,我想会不会有时可能产生错乱的结果。



------解决方案--------------------
是有可能的
------解决方案--------------------
楼主你好,我没有试过你的代码
不过我知道的是,如果是多线程,不管是static还是非static
都会牵扯到一个 同步 的问题。
------解决方案--------------------
我想问问这两个线程做的一些数据处理会不会混淆在一起,产生出错乱的结果,
---
就这个代码而言,不会产生混淆。因为PrintStream的方法有线程同步的



方法有static关键字和没有static 关键字的时候对多线程运行有没有影响
---
没有任何影响
------解决方案--------------------
我觉得LZ的理解有问题,多线程只是同步问题,跟static没关系,static只是说明这个方法不必生成对象就可以调用,而多个对象同时调用同一个方法,不管是不是static,都会出现问题的。。。
------解决方案--------------------
多线程 是很理解的啊
------解决方案--------------------
当然会产生错乱的结果,没有进行同步,就会产生。要想不产生错乱的结果,必须在进入临界区前加锁。静态方法虽然是属于整个类共享,只是代码共享,有可能传递不同的参数给静态方法。给段代码你参考。
public class TTT implements Runnable{
static class A{
static void f(int n){
for(int i=n;i<1000+n;i++)
System.out.print("good"+n);
}
}
int n;
TTT(int x){n=x;}
public void run(){
A.f(n);
}

public static void main(String[] args){
new Thread(new TTT(0)).start();
new Thread(new TTT(1000)).start();

}
}

------解决方案--------------------
这个就会产生错乱的结果

------解决方案--------------------
线程就是 内核对象+地址空间
JAVA线程会在创建线程栈,在自己的空间里执行.可以访问父线程上下文的资源
如果多线程执行时涉及到资源共享 就可能会产生混乱 需要进行同步
------解决方案--------------------
我经过了测试了
没有影响
------解决方案--------------------
感觉 这个static方法没有用到公有属性
参数都是在线程内部传进去的
每个线程调用这个方法的时候
都是将方法和参数压到各自的栈中(我记得我老师说过线程都是各有一个栈)
他们相互之间的属性没有耦合

------解决方案--------------------
Java code

package com.keeya.test;
import keeya.util.*;

public class ThreadTest extends Thread {
    public static int i = 0 , j = 0 ;
    public void run() {
        i++;
        j++;
        Test.test(i, j);
    }
    public static void main(String[] args) {
        Thread thread1 = new ThreadTest();
        Thread thread2 = new ThreadTest();
        Thread thread3 = new ThreadTest();
        Thread thread4 = new ThreadTest();
        Thread thread5 = new ThreadTest();
        Thread thread6 = new ThreadTest();
        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
        thread5.start();
        thread6.start();
    }
    
}
class Test {

    public static void test(int i,int j){ 
        MyOwnerPrint.println("This is {0} and i = {1}, j = {2}",Thread.currentThread(),i,j);
        int temp = 100000000;
        while(temp-- > 0);
        MyOwnerPrint.println("This is {0} and i + j = {1}",Thread.currentThread(),i+j);
    }
}

------解决方案--------------------