{"id":2394,"date":"2024-09-02T17:23:08","date_gmt":"2024-09-02T09:23:08","guid":{"rendered":"https:\/\/sanlangcode.com\/?p=2394"},"modified":"2024-09-02T17:23:08","modified_gmt":"2024-09-02T09:23:08","slug":"c%e5%92%8cjava%e7%9a%84%e5%a4%9a%e7%ba%bf%e7%a8%8b%e5%af%b9%e6%af%94%e5%92%8c%e4%bd%bf%e7%94%a8","status":"publish","type":"post","link":"https:\/\/sanlangcode.com\/index.php\/2024\/09\/02\/c%e5%92%8cjava%e7%9a%84%e5%a4%9a%e7%ba%bf%e7%a8%8b%e5%af%b9%e6%af%94%e5%92%8c%e4%bd%bf%e7%94%a8\/","title":{"rendered":"C#\u548cJava\u7684\u591a\u7ebf\u7a0b\u5bf9\u6bd4\u548c\u4f7f\u7528"},"content":{"rendered":"\n<pre class=\"wp-block-preformatted\">C# \u548c Java \u90fd\u662f\u529f\u80fd\u5f3a\u5927\u7684\u7f16\u7a0b\u8bed\u8a00\uff0c\u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684\u591a\u7ebf\u7a0b\u652f\u6301\uff0c\u4ee5\u5b9e\u73b0\u5e76\u53d1\u548c\u5e76\u884c\u5904\u7406\u3002\u5c3d\u7ba1\u4e24\u8005\u5728\u591a\u7ebf\u7a0b\u7f16\u7a0b\u7684\u57fa\u672c\u6982\u5ff5\u4e0a\u76f8\u4f3c\uff0c\u4f46\u5728\u5177\u4f53\u5b9e\u73b0\u3001\u5e93\u548c\u5de5\u5177\u4e0a\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\u3002\u4ee5\u4e0b\u5c06\u8be6\u7ec6\u6bd4\u8f83 C# \u548c Java \u7684\u591a\u7ebf\u7a0b\u673a\u5236\uff0c\u5305\u62ec\u7ebf\u7a0b\u521b\u5efa\u4e0e\u7ba1\u7406\u3001\u540c\u6b65\u673a\u5236\u3001\u7ebf\u7a0b\u6c60\u3001\u5e76\u884c\u7f16\u7a0b\u6a21\u578b\u4ee5\u53ca\u9ad8\u5c42\u62bd\u8c61\u7b49\u65b9\u9762\u3002\n\n1. <strong>\u7ebf\u7a0b\u521b\u5efa\u4e0e\u7ba1\u7406<\/strong>\n<strong>C#<\/strong>\n<strong>a. \u4f7f\u7528 <code>Thread<\/code> \u7c7b<\/strong>\nC# \u63d0\u4f9b\u4e86 <code>System.Threading.Thread<\/code> \u7c7b\u6765\u76f4\u63a5\u521b\u5efa\u548c\u7ba1\u7406\u7ebf\u7a0b\u3002\nusing System;\nusing System.Threading;\n\u200b\nclass Program\n{\n \u00a0  static void Main()\n \u00a0  {\n \u00a0 \u00a0 \u00a0  Thread thread = new Thread(new ThreadStart(DoWork));\n \u00a0 \u00a0 \u00a0  thread.Start();\n \u00a0 \u00a0 \u00a0  thread.Join(); \/\/ \u7b49\u5f85\u7ebf\u7a0b\u5b8c\u6210\n \u00a0  }\n\u200b\n \u00a0  static void DoWork()\n \u00a0  {\n \u00a0 \u00a0 \u00a0  Console.WriteLine(\"\u7ebf\u7a0b\u6b63\u5728\u5de5\u4f5c...\");\n \u00a0  }\n}\n<strong>b. \u4f7f\u7528\u4efb\u52a1 (<code>Task<\/code>) \u548c <code>async\/await<\/code><\/strong>\nC# \u63d0\u4f9b\u4e86\u66f4\u9ad8\u7ea7\u7684\u5e76\u53d1\u6a21\u578b\uff0c\u901a\u8fc7 <code>Task<\/code> \u7c7b\u548c <code>async\/await<\/code> \u5173\u952e\u5b57\u7b80\u5316\u5f02\u6b65\u7f16\u7a0b\u3002\nusing System;\nusing System.Threading.Tasks;\n\u200b\nclass Program\n{\n \u00a0  static async Task Main()\n \u00a0  {\n \u00a0 \u00a0 \u00a0  await DoWorkAsync();\n \u00a0  }\n\u200b\n \u00a0  static async Task DoWorkAsync()\n \u00a0  {\n \u00a0 \u00a0 \u00a0  await Task.Run(() =>\n \u00a0 \u00a0 \u00a0  {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  Console.WriteLine(\"\u5f02\u6b65\u4efb\u52a1\u6b63\u5728\u5de5\u4f5c...\");\n \u00a0 \u00a0 \u00a0  });\n \u00a0  }\n}\n<strong>Java<\/strong>\n<strong>a. \u4f7f\u7528 <code>Thread<\/code> \u7c7b<\/strong>\nJava \u63d0\u4f9b\u4e86 <code>java.lang.Thread<\/code> \u7c7b\u6765\u76f4\u63a5\u521b\u5efa\u548c\u7ba1\u7406\u7ebf\u7a0b\u3002\npublic class Main {\n \u00a0  public static void main(String[] args) {\n \u00a0 \u00a0 \u00a0  Thread thread = new Thread(new Runnable() {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  public void run() {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  System.out.println(\"\u7ebf\u7a0b\u6b63\u5728\u5de5\u4f5c...\");\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }\n \u00a0 \u00a0 \u00a0  });\n \u00a0 \u00a0 \u00a0  thread.start();\n \u00a0 \u00a0 \u00a0  try {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  thread.join(); \/\/ \u7b49\u5f85\u7ebf\u7a0b\u5b8c\u6210\n \u00a0 \u00a0 \u00a0  } catch (InterruptedException e) {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  e.printStackTrace();\n \u00a0 \u00a0 \u00a0  }\n \u00a0  }\n}\n<strong>b. \u4f7f\u7528 <code>ExecutorService<\/code><\/strong>\nJava \u63a8\u8350\u4f7f\u7528 <code>ExecutorService<\/code> \u6765\u7ba1\u7406\u7ebf\u7a0b\u6c60\u548c\u4efb\u52a1\u3002\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\n\u200b\npublic class Main {\n \u00a0  public static void main(String[] args) {\n \u00a0 \u00a0 \u00a0  ExecutorService executor = Executors.newFixedThreadPool(2);\n \u00a0 \u00a0 \u00a0  executor.submit(() -> {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  System.out.println(\"\u5f02\u6b65\u4efb\u52a1\u6b63\u5728\u5de5\u4f5c...\");\n \u00a0 \u00a0 \u00a0  });\n \u00a0 \u00a0 \u00a0  executor.shutdown();\n \u00a0  }\n}\n\n2. <strong>\u540c\u6b65\u673a\u5236<\/strong>\n<strong>C#<\/strong>\n<strong>a. <code>lock<\/code> \u5173\u952e\u5b57<\/strong>\n\u7528\u4e8e\u7b80\u5316 <code>Monitor<\/code> \u7684\u4f7f\u7528\uff0c\u786e\u4fdd\u540c\u4e00\u65f6\u95f4\u53ea\u6709\u4e00\u4e2a\u7ebf\u7a0b\u53ef\u4ee5\u8bbf\u95ee\u7279\u5b9a\u4ee3\u7801\u5757\u3002\nprivate static readonly object _lock = new object();\n\u200b\npublic void CriticalSection()\n{\n \u00a0  lock (_lock)\n \u00a0  {\n \u00a0 \u00a0 \u00a0  \/\/ \u7ebf\u7a0b\u5b89\u5168\u7684\u4ee3\u7801\n \u00a0  }\n}\n<strong>b. <code>Monitor<\/code> \u7c7b<\/strong>\n\u63d0\u4f9b\u66f4\u7ec6\u7c92\u5ea6\u7684\u63a7\u5236\uff0c\u5982\u7b49\u5f85\u548c\u901a\u77e5\u673a\u5236\u3002\nprivate static readonly object _lock = new object();\n\u200b\npublic void CriticalSection()\n{\n \u00a0  Monitor.Enter(_lock);\n \u00a0  try\n \u00a0  {\n \u00a0 \u00a0 \u00a0  \/\/ \u7ebf\u7a0b\u5b89\u5168\u7684\u4ee3\u7801\n \u00a0  }\n \u00a0  finally\n \u00a0  {\n \u00a0 \u00a0 \u00a0  Monitor.Exit(_lock);\n \u00a0  }\n}\n<strong>c. \u5176\u4ed6\u540c\u6b65\u539f\u8bed<\/strong>\n<code>Mutex<\/code>\uff1a\u8de8\u8fdb\u7a0b\u540c\u6b65\u3002\n<code>Semaphore<\/code> \u548c <code>SemaphoreSlim<\/code>\uff1a\u9650\u5236\u5bf9\u8d44\u6e90\u7684\u5e76\u53d1\u8bbf\u95ee\u3002\n<code>ReaderWriterLockSlim<\/code>\uff1a\u5141\u8bb8\u591a\u4e2a\u8bfb\u53d6\u7ebf\u7a0b\u6216\u4e00\u4e2a\u5199\u5165\u7ebf\u7a0b\u3002\n<strong>Java<\/strong>\n<strong>a. <code>synchronized<\/code> \u5173\u952e\u5b57<\/strong>\n\u7528\u4e8e\u65b9\u6cd5\u6216\u4ee3\u7801\u5757\uff0c\u786e\u4fdd\u540c\u4e00\u65f6\u95f4\u53ea\u6709\u4e00\u4e2a\u7ebf\u7a0b\u53ef\u4ee5\u8bbf\u95ee\u3002\npublic class Example {\n \u00a0  private final Object lock = new Object();\n\u200b\n \u00a0  public void criticalSection() {\n \u00a0 \u00a0 \u00a0  synchronized(lock) {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  \/\/ \u7ebf\u7a0b\u5b89\u5168\u7684\u4ee3\u7801\n \u00a0 \u00a0 \u00a0  }\n \u00a0  }\n}\n<strong>b. <code>ReentrantLock<\/code><\/strong>\n\u63d0\u4f9b\u6bd4 <code>synchronized<\/code> \u66f4\u7075\u6d3b\u7684\u9501\u673a\u5236\uff0c\u5982\u53ef\u4e2d\u65ad\u9501\u3001\u5b9a\u65f6\u9501\u7b49\u3002\nimport java.util.concurrent.locks.ReentrantLock;\n\u200b\npublic class Example {\n \u00a0  private final ReentrantLock lock = new ReentrantLock();\n\u200b\n \u00a0  public void criticalSection() {\n \u00a0 \u00a0 \u00a0  lock.lock();\n \u00a0 \u00a0 \u00a0  try {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  \/\/ \u7ebf\u7a0b\u5b89\u5168\u7684\u4ee3\u7801\n \u00a0 \u00a0 \u00a0  } finally {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  lock.unlock();\n \u00a0 \u00a0 \u00a0  }\n \u00a0  }\n}\n<strong>c. \u5176\u4ed6\u540c\u6b65\u539f\u8bed<\/strong>\n<code>Semaphore<\/code> \u548c <code>SemaphoreSlim<\/code>\uff08Java\u4e2d\u79f0\u4e3a <code>Semaphore<\/code>\uff09\u3002\n<code>ReadWriteLock<\/code>\uff08\u5982 <code>ReentrantReadWriteLock<\/code>\uff09\uff1a\u5141\u8bb8\u591a\u4e2a\u8bfb\u53d6\u7ebf\u7a0b\u6216\u4e00\u4e2a\u5199\u5165\u7ebf\u7a0b\u3002\n<code>CountDownLatch<\/code>\u3001<code>CyclicBarrier<\/code> \u7b49\u7528\u4e8e\u7ebf\u7a0b\u534f\u8c03\u3002\n\n3. <strong>\u7ebf\u7a0b\u6c60<\/strong>\n<strong>C#<\/strong>\n<strong>a. <code>ThreadPool<\/code> \u7c7b<\/strong>\nC# \u63d0\u4f9b\u4e86 <code>System.Threading.ThreadPool<\/code> \u6765\u7ba1\u7406\u4e00\u7ec4\u5de5\u4f5c\u7ebf\u7a0b\uff0c\u51cf\u5c11\u7ebf\u7a0b\u521b\u5efa\u548c\u9500\u6bc1\u7684\u5f00\u9500\u3002\nusing System;\nusing System.Threading;\n\u200b\nclass Program\n{\n \u00a0  static void Main()\n \u00a0  {\n \u00a0 \u00a0 \u00a0  ThreadPool.QueueUserWorkItem(DoWork);\n \u00a0 \u00a0 \u00a0  \/\/ \u7b49\u5f85\u5de5\u4f5c\u5b8c\u6210\n \u00a0 \u00a0 \u00a0  Thread.Sleep(1000);\n \u00a0  }\n\u200b\n \u00a0  static void DoWork(Object stateInfo)\n \u00a0  {\n \u00a0 \u00a0 \u00a0  Console.WriteLine(\"\u7ebf\u7a0b\u6c60\u7ebf\u7a0b\u6b63\u5728\u5de5\u4f5c...\");\n \u00a0  }\n}\n<strong>b. \u4efb\u52a1\u5e76\u884c\u5e93 (TPL)<\/strong>\n\u57fa\u4e8e <code>Task<\/code> \u7684\u66f4\u9ad8\u7ea7\u7ebf\u7a0b\u6c60\u7ba1\u7406\uff0c\u652f\u6301\u4efb\u52a1\u8c03\u5ea6\u3001\u53d6\u6d88\u548c\u7ed3\u679c\u5904\u7406\u3002\nusing System;\nusing System.Threading.Tasks;\n\u200b\nclass Program\n{\n \u00a0  static async Task Main()\n \u00a0  {\n \u00a0 \u00a0 \u00a0  await Task.Run(() =>\n \u00a0 \u00a0 \u00a0  {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  Console.WriteLine(\"\u4efb\u52a1\u5e76\u884c\u5e93\u7ebf\u7a0b\u6b63\u5728\u5de5\u4f5c...\");\n \u00a0 \u00a0 \u00a0  });\n \u00a0  }\n}\n<strong>Java<\/strong>\n<strong>a. <code>ExecutorService<\/code><\/strong>\nJava \u7684 <code>ExecutorService<\/code> \u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684\u7ebf\u7a0b\u6c60\u7ba1\u7406\u529f\u80fd\u3002\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\n\u200b\npublic class Main {\n \u00a0  public static void main(String[] args) {\n \u00a0 \u00a0 \u00a0  ExecutorService executor = Executors.newFixedThreadPool(2);\n \u00a0 \u00a0 \u00a0  executor.submit(() -> {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  System.out.println(\"\u7ebf\u7a0b\u6c60\u7ebf\u7a0b\u6b63\u5728\u5de5\u4f5c...\");\n \u00a0 \u00a0 \u00a0  });\n \u00a0 \u00a0 \u00a0  executor.shutdown();\n \u00a0  }\n}\n<strong>b. <code>ForkJoinPool<\/code><\/strong>\n\u9002\u7528\u4e8e\u5206\u6cbb\u7b97\u6cd5\u548c\u5e76\u884c\u4efb\u52a1\u5904\u7406\uff0cJava 7 \u5f15\u5165\uff0cJava 8 \u5bf9\u5176\u8fdb\u884c\u4e86\u6269\u5c55\u4ee5\u652f\u6301\u6d41 (<code>Streams<\/code>) \u7684\u5e76\u884c\u5904\u7406\u3002\nimport java.util.concurrent.ForkJoinPool;\n\u200b\npublic class Main {\n \u00a0  public static void main(String[] args) {\n \u00a0 \u00a0 \u00a0  ForkJoinPool forkJoinPool = new ForkJoinPool();\n \u00a0 \u00a0 \u00a0  forkJoinPool.submit(() -> {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  System.out.println(\"ForkJoinPool \u7ebf\u7a0b\u6b63\u5728\u5de5\u4f5c...\");\n \u00a0 \u00a0 \u00a0  });\n \u00a0 \u00a0 \u00a0  forkJoinPool.shutdown();\n \u00a0  }\n}\n\n4. <strong>\u5e76\u884c\u7f16\u7a0b\u6a21\u578b<\/strong>\n<strong>C#<\/strong>\n<strong>a. Task Parallel Library (TPL)<\/strong>\n\u63d0\u4f9b\u4e86\u5e76\u884c\u5faa\u73af (<code>Parallel.For<\/code>, <code>Parallel.ForEach<\/code>) \u548c\u6570\u636e\u5e76\u884c\u529f\u80fd\u3002\nusing System;\nusing System.Threading.Tasks;\n\u200b\nclass Program\n{\n \u00a0  static void Main()\n \u00a0  {\n \u00a0 \u00a0 \u00a0  Parallel.For(0, 10, i =>\n \u00a0 \u00a0 \u00a0  {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  Console.WriteLine($\"\u5e76\u884c\u5faa\u73af\u8fed\u4ee3 {i} \u5728\u7ebf\u7a0b {Task.CurrentId}\");\n \u00a0 \u00a0 \u00a0  });\n \u00a0  }\n}\n<strong>b. PLINQ (Parallel LINQ)<\/strong>\n\u5728 LINQ \u67e5\u8be2\u4e2d\u81ea\u52a8\u5e76\u884c\u5316\u64cd\u4f5c\uff0c\u7b80\u5316\u6570\u636e\u5e76\u884c\u5904\u7406\u3002\nusing System;\nusing System.Linq;\n\u200b\nclass Program\n{\n \u00a0  static void Main()\n \u00a0  {\n \u00a0 \u00a0 \u00a0  var numbers = Enumerable.Range(1, 10000);\n \u00a0 \u00a0 \u00a0  var evenNumbers = numbers.AsParallel().Where(n => n % 2 == 0).ToList();\n \u00a0 \u00a0 \u00a0  Console.WriteLine($\"\u5076\u6570\u6570\u91cf: {evenNumbers.Count}\");\n \u00a0  }\n}\n<strong>c. <code>async<\/code> \u548c <code>await<\/code><\/strong>\n\u7b80\u5316\u5f02\u6b65\u7f16\u7a0b\uff0c\u4f7f\u5f02\u6b65\u4ee3\u7801\u770b\u8d77\u6765\u50cf\u540c\u6b65\u4ee3\u7801\uff0c\u6613\u4e8e\u7f16\u5199\u548c\u7ef4\u62a4\u3002\nusing System;\nusing System.Threading.Tasks;\n\u200b\nclass Program\n{\n \u00a0  static async Task Main()\n \u00a0  {\n \u00a0 \u00a0 \u00a0  await PerformAsyncOperation();\n \u00a0  }\n\u200b\n \u00a0  static async Task PerformAsyncOperation()\n \u00a0  {\n \u00a0 \u00a0 \u00a0  await Task.Delay(1000);\n \u00a0 \u00a0 \u00a0  Console.WriteLine(\"\u5f02\u6b65\u64cd\u4f5c\u5b8c\u6210\");\n \u00a0  }\n}\n<strong>Java<\/strong>\n<strong>a. \u5e76\u884c\u6d41 (Parallel Streams)<\/strong>\nJava 8 \u5f15\u5165\u7684 <code>Streams<\/code> API \u652f\u6301\u5e76\u884c\u5904\u7406\uff0c\u7b80\u5316\u6570\u636e\u5e76\u884c\u64cd\u4f5c\u3002\nimport java.util.stream.IntStream;\n\u200b\npublic class Main {\n \u00a0  public static void main(String[] args) {\n \u00a0 \u00a0 \u00a0  IntStream.range(0, 10).parallel().forEach(i -> {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  System.out.println(\"\u5e76\u884c\u6d41\u8fed\u4ee3 \" + i + \" \u5728\u7ebf\u7a0b \" + Thread.currentThread().getName());\n \u00a0 \u00a0 \u00a0  });\n \u00a0  }\n}\n<strong>b. <code>CompletableFuture<\/code><\/strong>\nJava 8 \u5f15\u5165\uff0c\u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u5f02\u6b65\u7f16\u7a0b\u652f\u6301\uff0c\u5141\u8bb8\u7ec4\u5408\u548c\u94fe\u63a5\u5f02\u6b65\u4efb\u52a1\u3002\nimport java.util.concurrent.CompletableFuture;\n\u200b\npublic class Main {\n \u00a0  public static void main(String[] args) {\n \u00a0 \u00a0 \u00a0  CompletableFuture&lt;Void> future = CompletableFuture.runAsync(() -> {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  System.out.println(\"\u5f02\u6b65\u4efb\u52a1\u6b63\u5728\u5de5\u4f5c...\");\n \u00a0 \u00a0 \u00a0  });\n \u00a0 \u00a0 \u00a0  future.join(); \/\/ \u7b49\u5f85\u4efb\u52a1\u5b8c\u6210\n \u00a0  }\n}\n<strong>c. Fork\/Join \u6846\u67b6<\/strong>\n\u9002\u7528\u4e8e\u5206\u6cbb\u7b97\u6cd5\uff0cJava 7 \u5f15\u5165\uff0c\u5e76\u5728 Java 8 \u4e2d\u5f97\u5230\u6269\u5c55\u3002\nimport java.util.concurrent.ForkJoinPool;\nimport java.util.concurrent.RecursiveAction;\n\u200b\npublic class Main {\n \u00a0  public static void main(String[] args) {\n \u00a0 \u00a0 \u00a0  ForkJoinPool pool = new ForkJoinPool();\n \u00a0 \u00a0 \u00a0  pool.invoke(new MyRecursiveAction(0, 10));\n \u00a0 \u00a0 \u00a0  pool.shutdown();\n \u00a0  }\n}\n\u200b\nclass MyRecursiveAction extends RecursiveAction {\n \u00a0  private int start;\n \u00a0  private int end;\n\u200b\n \u00a0  MyRecursiveAction(int start, int end) {\n \u00a0 \u00a0 \u00a0  this.start = start;\n \u00a0 \u00a0 \u00a0  this.end = end;\n \u00a0  }\n\u200b\n \u00a0  protected void compute() {\n \u00a0 \u00a0 \u00a0  if (end - start &lt;= 2) {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  for (int i = start; i &lt; end; i++) {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  System.out.println(\"\u5904\u7406 \" + i + \" \u5728\u7ebf\u7a0b \" + Thread.currentThread().getName());\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  }\n \u00a0 \u00a0 \u00a0  } else {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  int mid = (start + end) \/ 2;\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  invokeAll(new MyRecursiveAction(start, mid), new MyRecursiveAction(mid, end));\n \u00a0 \u00a0 \u00a0  }\n \u00a0  }\n}\n\n5. <strong>\u9ad8\u5c42\u62bd\u8c61\u548c\u5e76\u53d1\u5e93<\/strong>\n<strong>C#<\/strong>\n<strong>a. \u5e76\u53d1\u96c6\u5408<\/strong>\n<code>ConcurrentDictionary&lt;TKey, TValue><\/code>\n<code>ConcurrentBag&lt;T><\/code>\n<code>ConcurrentQueue&lt;T><\/code>\n<code>ConcurrentStack&lt;T><\/code>\n\u8fd9\u4e9b\u96c6\u5408\u7c7b\u5728\u591a\u7ebf\u7a0b\u73af\u5883\u4e2d\u63d0\u4f9b\u7ebf\u7a0b\u5b89\u5168\u7684\u64cd\u4f5c\u3002\n<strong>b. \u4fe1\u53f7\u91cf\u548c\u4e8b\u4ef6<\/strong>\n<code>SemaphoreSlim<\/code>\uff1a\u8f7b\u91cf\u7ea7\u4fe1\u53f7\u91cf\u3002\n<code>AutoResetEvent<\/code> \u548c <code>ManualResetEvent<\/code>\uff1a\u7528\u4e8e\u7ebf\u7a0b\u95f4\u7684\u901a\u77e5\u548c\u540c\u6b65\u3002\n<strong>c. \u5e76\u884c LINQ (PLINQ)<\/strong>\n\u524d\u9762\u5df2\u63d0\u53ca\uff0c\u901a\u8fc7 <code>AsParallel()<\/code> \u65b9\u6cd5\u5b9e\u73b0\u6570\u636e\u5e76\u884c\u5904\u7406\u3002\n<strong>Java<\/strong>\n<strong>a. \u5e76\u53d1\u96c6\u5408<\/strong>\nJava \u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684\u5e76\u53d1\u96c6\u5408\u7c7b\uff0c\u5982\uff1a\n<code>ConcurrentHashMap&lt;K, V><\/code>\n<code>CopyOnWriteArrayList&lt;E><\/code>\n<code>ConcurrentLinkedQueue&lt;E><\/code>\n<code>BlockingQueue&lt;E><\/code>\uff08\u5982 <code>LinkedBlockingQueue<\/code>\uff09\n<strong>b. \u5e76\u53d1\u5de5\u5177<\/strong>\n<code>CountDownLatch<\/code>\uff1a\u7528\u4e8e\u7b49\u5f85\u591a\u4e2a\u7ebf\u7a0b\u5b8c\u6210\u3002\n<code>CyclicBarrier<\/code>\uff1a\u5141\u8bb8\u4e00\u7ec4\u7ebf\u7a0b\u4e92\u76f8\u7b49\u5f85\uff0c\u76f4\u5230\u6240\u6709\u7ebf\u7a0b\u90fd\u5230\u8fbe\u5c4f\u969c\u70b9\u3002\n<code>Semaphore<\/code>\uff1a\u63a7\u5236\u5bf9\u8d44\u6e90\u7684\u8bbf\u95ee\u3002\n<strong>c. <code>java.util.concurrent<\/code> \u5305<\/strong>\n\u5305\u542b\u4e86\u5927\u91cf\u7684\u5e76\u53d1\u5de5\u5177\u548c\u62bd\u8c61\uff0c\u5982 <code>ExecutorService<\/code>\u3001<code>Future<\/code>\u3001<code>CompletableFuture<\/code> \u7b49\u3002\n\n6. <strong>\u5dee\u5f02\u4e0e\u6bd4\u8f83<\/strong>\n<strong>a. \u8bed\u8a00\u7279\u6027<\/strong>\n<strong>C#<\/strong>\uff1a<code>async\/await<\/code> \u8bed\u6cd5\u4f7f\u5f02\u6b65\u7f16\u7a0b\u66f4\u52a0\u7b80\u6d01\u548c\u76f4\u89c2\uff0c\u7ed3\u5408 <code>Task<\/code> \u7c7b\u63d0\u4f9b\u5f3a\u5927\u7684\u5e76\u53d1\u652f\u6301\u3002\n<strong>Java<\/strong>\uff1a<code>CompletableFuture<\/code> \u548c\u6d41\u7684\u5e76\u884c\u5316 (<code>Parallel Streams<\/code>) \u63d0\u4f9b\u4e86\u7c7b\u4f3c\u7684\u5f02\u6b65\u548c\u5e76\u884c\u7f16\u7a0b\u80fd\u529b\uff0c\u4f46\u8bed\u6cd5\u4e0a\u7a0d\u663e\u590d\u6742\u3002\n<strong>b. \u5e93\u548c\u6846\u67b6<\/strong>\n<strong>C#<\/strong>\uff1a\u4efb\u52a1\u5e76\u884c\u5e93 (TPL) \u548c PLINQ \u63d0\u4f9b\u4e86\u9ad8\u5c42\u6b21\u7684\u5e76\u884c\u7f16\u7a0b\u652f\u6301\uff0c\u96c6\u6210\u5728\u8bed\u8a00\u548c .NET \u751f\u6001\u7cfb\u7edf\u4e2d\u3002\n<strong>Java<\/strong>\uff1a<code>java.util.concurrent<\/code> \u5305\u63d0\u4f9b\u4e86\u5e7f\u6cdb\u7684\u5e76\u53d1\u5de5\u5177\uff0c\u7ed3\u5408 <code>ForkJoinPool<\/code> \u548c <code>ExecutorService<\/code> \u63d0\u4f9b\u4e86\u7075\u6d3b\u7684\u7ebf\u7a0b\u7ba1\u7406\u3002\n<strong>c. \u6027\u80fd\u4e0e\u4f18\u5316<\/strong>\n<strong>C#<\/strong>\uff1a\u901a\u8fc7 <code>ThreadPool<\/code> \u548c <code>Task<\/code> \u7684\u4f18\u5316\uff0c\u51cf\u5c11\u4e86\u7ebf\u7a0b\u521b\u5efa\u7684\u5f00\u9500\uff0c\u9002\u5408\u9ad8\u5e76\u53d1\u573a\u666f\u3002\n<strong>Java<\/strong>\uff1a<code>ForkJoinPool<\/code> \u9002\u7528\u4e8e\u5206\u6cbb\u4efb\u52a1\uff0c\u800c <code>ExecutorService<\/code> \u63d0\u4f9b\u4e86\u7075\u6d3b\u7684\u7ebf\u7a0b\u6c60\u914d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5e76\u53d1\u9700\u6c42\u3002\n<strong>d. \u5e76\u53d1\u6a21\u578b<\/strong>\n<strong>C#<\/strong>\uff1a\u504f\u5411\u4e8e\u57fa\u4e8e\u4efb\u52a1\u7684\u5e76\u53d1\u6a21\u578b\uff0c\u901a\u8fc7 <code>Task<\/code> \u548c <code>async\/await<\/code> \u5b9e\u73b0\u9ad8\u6548\u7684\u5f02\u6b65\u7f16\u7a0b\u3002\n<strong>Java<\/strong>\uff1a \u63d0\u4f9b\u4e86\u57fa\u4e8e\u7ebf\u7a0b\u548c\u57fa\u4e8e\u4efb\u52a1\u7684\u5e76\u53d1\u6a21\u578b\uff0c<code>CompletableFuture<\/code> \u548c\u6d41\u7684\u5e76\u884c\u5316\u63d0\u4f9b\u4e86\u73b0\u4ee3\u7684\u5e76\u53d1\u7f16\u7a0b\u65b9\u5f0f\u3002\n<strong>e. \u9501\u673a\u5236<\/strong>\n<strong>C#<\/strong>\uff1a<code>lock<\/code> \u5173\u952e\u5b57\u7b80\u5316\u4e86\u57fa\u4e8e <code>Monitor<\/code> \u7684\u9501\u673a\u5236\uff0c\u63d0\u4f9b\u4e86\u6613\u4e8e\u4f7f\u7528\u7684\u540c\u6b65\u65b9\u5f0f\u3002\n<strong>Java<\/strong>\uff1a<code>synchronized<\/code> \u5173\u952e\u5b57\u548c <code>ReentrantLock<\/code> \u63d0\u4f9b\u4e86\u7075\u6d3b\u7684\u9501\u673a\u5236\uff0c\u5141\u8bb8\u66f4\u7ec6\u7c92\u5ea6\u7684\u63a7\u5236\u3002\n\n7. <strong>\u793a\u4f8b\u5bf9\u6bd4<\/strong>\n<strong>a. \u7b80\u5355\u7ebf\u7a0b\u521b\u5efa<\/strong>\n<strong>C#<\/strong>\nusing System;\nusing System.Threading;\n\u200b\nclass Program\n{\n \u00a0  static void Main()\n \u00a0  {\n \u00a0 \u00a0 \u00a0  Thread thread = new Thread(() => {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  Console.WriteLine(\"C# \u7ebf\u7a0b\u6b63\u5728\u5de5\u4f5c...\");\n \u00a0 \u00a0 \u00a0  });\n \u00a0 \u00a0 \u00a0  thread.Start();\n \u00a0 \u00a0 \u00a0  thread.Join();\n \u00a0  }\n}\n<strong>Java<\/strong>\npublic class Main {\n \u00a0  public static void main(String[] args) {\n \u00a0 \u00a0 \u00a0  Thread thread = new Thread(() -> {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  System.out.println(\"Java \u7ebf\u7a0b\u6b63\u5728\u5de5\u4f5c...\");\n \u00a0 \u00a0 \u00a0  });\n \u00a0 \u00a0 \u00a0  thread.start();\n \u00a0 \u00a0 \u00a0  try {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  thread.join();\n \u00a0 \u00a0 \u00a0  } catch (InterruptedException e) {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  e.printStackTrace();\n \u00a0 \u00a0 \u00a0  }\n \u00a0  }\n}\n<strong>b. \u4f7f\u7528\u7ebf\u7a0b\u6c60\u6267\u884c\u4efb\u52a1<\/strong>\n<strong>C#<\/strong>\nusing System;\nusing System.Threading.Tasks;\n\u200b\nclass Program\n{\n \u00a0  static void Main()\n \u00a0  {\n \u00a0 \u00a0 \u00a0  Task.Run(() => {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  Console.WriteLine(\"C# \u7ebf\u7a0b\u6c60\u4efb\u52a1\u6b63\u5728\u5de5\u4f5c...\");\n \u00a0 \u00a0 \u00a0  }).Wait();\n \u00a0  }\n}\n<strong>Java<\/strong>\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\n\u200b\npublic class Main {\n \u00a0  public static void main(String[] args) {\n \u00a0 \u00a0 \u00a0  ExecutorService executor = Executors.newCachedThreadPool();\n \u00a0 \u00a0 \u00a0  executor.submit(() -> {\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0  System.out.println(\"Java \u7ebf\u7a0b\u6c60\u4efb\u52a1\u6b63\u5728\u5de5\u4f5c...\");\n \u00a0 \u00a0 \u00a0  });\n \u00a0 \u00a0 \u00a0  executor.shutdown();\n \u00a0  }\n}\n\n8. <strong>\u6700\u4f73\u5b9e\u8df5<\/strong>\n<strong>C#<\/strong>\n<strong>\u4f7f\u7528 <code>async\/await<\/code><\/strong>\uff1a\u5c3d\u53ef\u80fd\u4f7f\u7528\u5f02\u6b65\u7f16\u7a0b\u6a21\u578b\uff0c\u907f\u514d\u963b\u585e\u7ebf\u7a0b\u3002\n<strong>\u5229\u7528 TPL \u548c PLINQ<\/strong>\uff1a\u7b80\u5316\u5e76\u884c\u4efb\u52a1\u548c\u6570\u636e\u5904\u7406\u3002\n<strong>\u907f\u514d\u8fc7\u5ea6\u4f7f\u7528 <code>lock<\/code><\/strong>\uff1a\u4f7f\u7528\u9ad8\u5c42\u6b21\u7684\u5e76\u53d1\u5de5\u5177\uff0c\u5982 <code>Concurrent<\/code> \u96c6\u5408\u6216 <code>SemaphoreSlim<\/code>\uff0c\u4ee5\u51cf\u5c11\u6b7b\u9501\u98ce\u9669\u3002\n<strong>\u8d44\u6e90\u7ba1\u7406<\/strong>\uff1a\u4f7f\u7528 <code>using<\/code> \u8bed\u53e5\u7ba1\u7406\u8d44\u6e90\uff0c\u786e\u4fdd\u53ca\u65f6\u91ca\u653e\u3002\n<strong>Java<\/strong>\n<strong>\u4f18\u5148\u4f7f\u7528 <code>ExecutorService<\/code><\/strong>\uff1a\u907f\u514d\u76f4\u63a5\u521b\u5efa\u548c\u7ba1\u7406\u7ebf\u7a0b\uff0c\u4f7f\u7528\u7ebf\u7a0b\u6c60\u63d0\u9ad8\u6027\u80fd\u3002\n<strong>\u5229\u7528 <code>CompletableFuture<\/code><\/strong>\uff1a\u7f16\u5199\u53ef\u7ec4\u5408\u7684\u5f02\u6b65\u4efb\u52a1\uff0c\u63d0\u9ad8\u4ee3\u7801\u53ef\u8bfb\u6027\u3002\n<strong>\u4f7f\u7528\u5e76\u53d1\u96c6\u5408<\/strong>\uff1a\u907f\u514d\u624b\u52a8\u540c\u6b65\uff0c\u4f7f\u7528 <code>java.util.concurrent<\/code> \u63d0\u4f9b\u7684\u7ebf\u7a0b\u5b89\u5168\u96c6\u5408\u3002\n<strong>\u5408\u7406\u914d\u7f6e\u7ebf\u7a0b\u6c60<\/strong>\uff1a\u6839\u636e\u5e94\u7528\u9700\u6c42\u8c03\u6574\u7ebf\u7a0b\u6c60\u5927\u5c0f\uff0c\u907f\u514d\u8fc7\u5ea6\u521b\u5efa\u7ebf\u7a0b\u5bfc\u81f4\u8d44\u6e90\u6d6a\u8d39\u3002\n\n9. <strong>\u603b\u7ed3<\/strong>\nC# \u548c Java \u90fd\u63d0\u4f9b\u4e86\u5f3a\u5927\u7684\u591a\u7ebf\u7a0b\u652f\u6301\uff0c\u901a\u8fc7\u4e30\u5bcc\u7684\u7c7b\u5e93\u548c\u8bed\u8a00\u7279\u6027\uff0c\u7b80\u5316\u4e86\u5e76\u53d1\u7f16\u7a0b\u7684\u590d\u6742\u6027\u3002\u4ee5\u4e0b\u662f\u4e24\u8005\u7684\u4e00\u4e9b\u5173\u952e\u6bd4\u8f83\u70b9\uff1a\n<strong>\u5f02\u6b65\u7f16\u7a0b<\/strong>\uff1aC# \u7684 <code>async\/await<\/code> \u8bed\u6cd5\u66f4\u4e3a\u7b80\u6d01\u76f4\u89c2\uff0c\u800c Java \u4f9d\u8d56\u4e8e <code>CompletableFuture<\/code> \u548c\u56de\u8c03\u673a\u5236\u3002\n<strong>\u5e76\u884c\u5e93<\/strong>\uff1aC# \u7684 TPL \u548c PLINQ \u63d0\u4f9b\u4e86\u9ad8\u7ea7\u7684\u5e76\u884c\u7f16\u7a0b\u652f\u6301\uff0cJava \u5219\u901a\u8fc7 <code>ForkJoinPool<\/code> \u548c\u5e76\u884c\u6d41\u5b9e\u73b0\u7c7b\u4f3c\u529f\u80fd\u3002\n<strong>\u540c\u6b65\u673a\u5236<\/strong>\uff1a\u4e24\u8005\u90fd\u63d0\u4f9b\u4e86\u591a\u79cd\u540c\u6b65\u5de5\u5177\uff0c\u4f46\u5728\u8bed\u6cd5\u548c\u4f7f\u7528\u4e60\u60ef\u4e0a\u6709\u6240\u4e0d\u540c\u3002C# \u7684 <code>lock<\/code> \u66f4\u4e3a\u7b80\u6d01\uff0cJava \u7684 <code>synchronized<\/code> \u548c <code>ReentrantLock<\/code> \u63d0\u4f9b\u4e86\u66f4\u591a\u7684\u7075\u6d3b\u6027\u3002\n<strong>\u7ebf\u7a0b\u6c60\u7ba1\u7406<\/strong>\uff1aC# \u7684 <code>ThreadPool<\/code> \u548c TPL \u5728\u4efb\u52a1\u7ba1\u7406\u4e0a\u66f4\u4e3a\u96c6\u6210\uff0cJava \u7684 <code>ExecutorService<\/code> \u63d0\u4f9b\u4e86\u66f4\u5e7f\u6cdb\u7684\u914d\u7f6e\u9009\u9879\u548c\u7b56\u7565\u3002\n<strong>\u5e76\u53d1\u96c6\u5408\u548c\u5de5\u5177<\/strong>\uff1aJava \u7684 <code>java.util.concurrent<\/code> \u5305\u529f\u80fd\u66f4\u4e3a\u5168\u9762\uff0c\u800c C# \u7684 <code>System.Collections.Concurrent<\/code> \u63d0\u4f9b\u4e86\u5e38\u7528\u7684\u5e76\u53d1\u96c6\u5408\u7c7b\u3002\n\u603b\u4f53\u800c\u8a00\uff0cC# \u548c Java \u5728\u591a\u7ebf\u7a0b\u7f16\u7a0b\u65b9\u9762\u5404\u6709\u4f18\u52bf\uff0c\u9009\u62e9\u54ea\u79cd\u8bed\u8a00\u548c\u5176\u5e76\u53d1\u6a21\u578b\u53d6\u51b3\u4e8e\u5177\u4f53\u7684\u9879\u76ee\u9700\u6c42\u3001\u5f00\u53d1\u56e2\u961f\u7684\u719f\u6089\u5ea6\u4ee5\u53ca\u751f\u6001\u7cfb\u7edf\u7684\u652f\u6301\u3002<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>C# \u548c Java \u90fd\u662f\u529f\u80fd\u5f3a\u5927&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-2394","post","type-post","status-publish","format-standard","hentry","category-4"],"_links":{"self":[{"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/posts\/2394","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/comments?post=2394"}],"version-history":[{"count":0,"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/posts\/2394\/revisions"}],"wp:attachment":[{"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/media?parent=2394"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/categories?post=2394"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sanlangcode.com\/index.php\/wp-json\/wp\/v2\/tags?post=2394"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}