想知道的话,可以自己去看JDK的代码,分析一下原因.
解决方案 »
- Exception in thread "main" java.lang.NullPointerException
- 用jxl操作excel设置 excel密码
- 出错了 关于JSP的问题!
- 刚开始JAVA之路的菜鸟有个问题,跪谢!
- 不在电脑属性中在哪还可以设置系统变量?????
- 如何通过jdk的api自动生成证书?
- 高分求助,struts的Action,ActionForm怎么用?
- 怎样用java调用DLL动态连接库?
- 我做的swing软件里有很多JLabel显示几秒就不显示了怎么才能把内存清掉?
- 大数据存什么数据库比较好啊
- 怎样通过AreaText.paste()来实现文本框的粘贴功能
- 各位高手!在哪可以找到些java啊applet圖形動畫方面的資料啊!幫幫忙,謝了啊!
多线程时,如果不同步,对同一个变量同时进行读写就可能有问题,任何方法只要没有对方法对外的变量进行赋值、重新指向另一对象(读取操作不算)等操作,它就是线程安全的。所以所有静态方法都是线程安全的。----------------------------------
不过像Math.pow()这样的函数怎么可能不用中间变量就计算出来呢?
我可是算的像Math.pow(3.14159265, 2.3248354);这样的运算呀。这可是特地从那里面找的最复杂的运算来测试呀。
静态方法也得看是什么样的,如:
public static void process(Connection con){
//process query
con.close();
con = null;
}
不出问题才怪.
如果你能保证你传到static里的值不改(或者你copy了一份)应该是没问题的.
public class TestMultithearding
{
public static int SIZE = 10000;
public static void main(String[] args)
{
TestMultithearding t = new TestMultithearding();
TestThread[] testThread = new TestThread[SIZE];
for (int i = 0; i < SIZE; i++)
{
testThread[i] = new TestThread();
}
for (int i = 0; i < SIZE; i++)
{
testThread[i].start();
}
}
}public class TestThread extends Thread
{
private static double pow = 1.000;
private double number;
private double standard = 1.03;
public TestThread()
{
pow = pow * 1.001;
number = pow;
System.out.println("number=" + number);
}
public void run()
{
double t = 0;
for (int i = 0; i < 10000; i++)
{
t = Math.pow(standard, number);
t = Math.pow(t, 1/number);
if (t + 1e-9 < standard || t - 1e-9 > standard)
{
System.out.println("出现错误!" + "\tnumber=" + number + "\t实际计算结果=" + t);
}
}
}
}
TestMultithearding t = new TestMultithearding();
因为在测试的时候System.out.println()语句也没有被分来运行,可能是java虚拟机把这些语句当成基础语句,在一个时间片里运行,不会拆在两个时间片中。对这些最基本的函数来说,一次只运行一个。所以没有多线程的问题。第一次来java社区,感觉这里的人不是很多嘛。
if (t + 1e-9 < standard || t - 1e-9 > standard)
应改为:
if (t * (1 + 1e-9) < standard || t * (1 - 1e-9) > standard)不好意思,出丑了。不过实际上面一行运行起来也没有问题,看来java在处理浮点型的时候方法还是挺优秀的。
呵呵,这给Java的脸上贴金了, Java的基本功能都是native的
才开始学java,对这些还是不太懂的。
http://blog.csdn.net/treeroot/archive/2005/01/14/254008.aspx
静态函数只有在内部引用了静态变量的时候,才会出现多线程同步问题。
静态函数内部创建的变量,在每个线程调用时都会另行创建,不会共用一个存储单元。
但是对于类中的静态成员,在类加载后就占用一个存储区,每个线程访问到该静态成员时,
都是对那个公共的存储区操作。
下面这段代码对比一下:
public class A{
static String name1="";
String name2="";
public static String setName1(String name){
this.name1=name;
}
public static String setName2(String name){
this.name2=name;
}
}
使用这2个静态方法时,setName1会出现多线程同步问题。setName2不会
怀疑pow就是接受这两个参数实现一定的运算 得到结果,
这个方法并没有对同一个对象(或数据段)进行操作
应该不存在同步问题
说的好。我写错了,静态方法只能访问类的静态成员。
访问非静态成员必须有一个类的实例。哎,失败&羞愧