题目:
启动若干线程,并行访问同一个容器中的数据。保证获取容器中数据时没有数据错误,且线程安全。如:售票,秒杀等业务。
import java.util.ArrayList; import java.util.List; public class Test_01 { static List<String> list = new ArrayList<>(); // static List<String> list = new Vector<>(); static { for (int i = 0; i < 10000; i++) { list.add("String " + i); } } public static void main(String[] args) { for (int i = 0; i < 10; i++) { new Thread(new Runnable() { @Override public void run() { while (list.size() > 0) { System.out.println(Thread.currentThread().getName() + " - " + list.remove(0)); } } }, "Thread" + i).start(); } // for(int i = 0; i < 10; i++){ // new Thread(new Runnable() { // @Override // public void run() { // while(true){ // synchronized (list) { // if(list.size() <= 0){ // break; // } // System.out.println(Thread.currentThread().getName() + " - " + list.remove(0)); // } // } // } // }, "Thread" + i).start(); // } } }
import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; public class Test_02 { static Queue<String> list = new ConcurrentLinkedQueue<>(); static { for (int i = 0; i < 10000; i++) { list.add("String " + i); } } public static void main(String[] args) { for (int i = 0; i < 10; i++) { new Thread(new Runnable() { @Override public void run() { while (true) { String str = list.poll(); if (str == null) { break; } System.out.println(Thread.currentThread().getName() + " - " + str); } } }, "Thread" + i).start(); } } }
Stay hungry,stay foolish !
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2018-04-23 linux命令学习之:du
2018-04-23 linux命令学习之:sort
2018-04-23 linux命令学习之:df