启动若干线程,并行访问同一个容器中的数据。保证获取容器中数据时没有数据错误,且线程安全。
如:售票,秒杀等业务。
方式一:使用同步
public class Test1 {
static List<String> list = new ArrayList<>();
public static void main(String[] args) {
for (int i = 0; i < 10000; i++) {
list.add("String " + i);
}
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
public void run() {
while (true) {
synchronized (list) {
if (list.size() <= 0) {
break;
}
System.out.println(Thread.currentThread().getName() + " - " + list.remove(0));
}
}
}
}, "Thread" + i).start();
}
}
}
方式二:使用同步容器
public class Test2 {
static Queue<String> list = new ConcurrentLinkedQueue<>();
public static void main(String[] args) {
for (int i = 0; i < 10000; i++) {
list.add("String " + i);
}
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
public void run() {
while (true) {
String str = list.poll();
if (str == null) {
break;
}
System.out.println(Thread.currentThread().getName() + " - " + str);
}
}
}, "Thread" + i).start();
}
}
}
网友评论