弄的我茶饭不思的多线程理解!
有一个问题,我一直很迷茫!希望大哥大姐仔细看完,帮我理透一下多线程的思路
如:有一个类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);
}
}
------解决方案--------------------