需求: 顺序循环使用账号调用某个接口。账号从数据库取得。外部环境是在一个线程的run方法里。
写了个测试,大家帮忙看下。
SafeNameProvider:package thread;import java.util.ArrayList;
import java.util.List;public class SafeNameProvider { private static SafeNameProvider singleton;

private static List<String> nameList;

private static long useCount;

private SafeNameProvider(){}

public static SafeNameProvider getInstance(){
synchronized(SafeNameProvider.class){
if(singleton == null){
singleton = new SafeNameProvider();
nameList = provideNameList();
}
}
return singleton;
}

public synchronized String fetchName(){
System.out.println("useCount : " + String.valueOf(useCount));
int len = nameList.size();
String name = nameList.get((int) (useCount%len));
useCount++;
return name;
}

private static List<String> provideNameList(){
if(nameList == null){
nameList = new ArrayList<String>();
nameList.add("apple");
nameList.add("orange");
nameList.add("banana");
nameList.add("pitch");
}
return nameList;
}
}
AppThread:package thread;public class AppThread implements Runnable { public void run() {
System.out.println("run : ----------------->");
String name = SafeNameProvider.getInstance().fetchName();
System.out.println("name : " + name);
try {
Thread.currentThread().sleep(1000*4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end : <-----------------------");
}}
Client:package thread;public class Client { public static void main(String[] args) {
Client c = new Client();
try {
c.test();
} catch (Exception e) {
e.printStackTrace();
}
}

private void test() throws Exception{
new Thread(new AppThread()).start();
new Thread(new AppThread()).start();
new Thread(new AppThread()).start();
Thread.currentThread().sleep(1000*10);
new Thread(new AppThread()).start();
new Thread(new AppThread()).start();
new Thread(new AppThread()).start();
}
}
一个问题是:上面代码是否安全,有没得改进;
另个问题是:取数据,目前我的判断是 list==null ,但我发现,如果数据库里增加了,或者减少了,没控制。不知大家有没什么好的 建议。