在java中,原来以为用synchronized修饰的方法在任何情况下应该都是单并发执行的,后来经过测试表明这个方法必须是公用的,因为synchronized锁定的对象而不是对象的方法,所以如果这个对象不是公用的,那么即使加了synchronized方法也是没有用的。
1.这里有一个类,它负责创建100个线程并启动他们
/*
* ©2002-2016 ****, Inc. All rights reserved.
*/
package com.test.thread;
/**
* Starts 功能描述:创建并启动100个线程
*
* @author RickyLee
* @date 2016/11/4 13:52
*/
public class Starts {
public static void main(String[] args) {
for(int i=0;i<100;i++){
String name="[thread"+i+"]";
new TT(name).start();
}
}
}
2.每个线程每隔0.1秒执行一次打印操作,一直打印100次
/*
* ©2002-2016 ****, Inc. All rights reserved.
*/
package com.test.thread;
/**
* Thread 功能描述:TODO
*
* @author RickyLee
* @date 2016/11/4 13:41
*/
public class TT extends Thread{
private String tName=null;
public TT(String name){
tName=name;
}
public void run() {
try {
for(int i=0;i<100;i++){
Test.start(tName);
sleep(100);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
3.调用公用打印方法
/*
* ©2002-2016 ****, Inc. All rights reserved.
*/
package com.test.thread;
/**
* Test 功能描述:负责方法在执行的时候给全局变量+1并打印全局变量
*
* @author RickyLee
* @date 2016/11/4 13:41
*/
public class Test {
private static int counter=0;
public synchronized static void start(String threadName){
counter++;
System.out.println(threadName+" "+counter);
}
}
大家可以试一下,如果把static去掉,前面采用new Test().start(tName);的方式,结果就会非常错乱。
以前的认识有些误区,一起共勉!