久久96国产精品久久久-久久发布国产伦子伦精品-久久精品国产精品青草-久久天天躁夜夜躁狠狠85麻豆

技術員聯盟提供win764位系統下載,win10,win7,xp,裝機純凈版,64位旗艦版,綠色軟件,免費軟件下載基地!

當前位置:主頁 > 教程 > 服務器類 >

Java 中Object的wait() notify() notifyAll()方法如何使用

來源:技術員聯盟┆發布時間:2017-09-05 12:40┆點擊:

  我們都知道nodejs最大的特點就是單進程、無阻塞運行,并且是異步事件驅動的。Nodejs的這些特性能夠很好的解決一些問題,例如在服務器開發中,并發的請求處理是個大問題,阻塞式的函數會導致資源浪費和時間延遲。通過事件注冊、異步函數,開發人員可以提高資源的利用率,性能也會改善。既然Node.js采用單進程、單線程模式,那么在如今多核硬件流行的環境中,單核性能出色的Nodejs如何利用多核CPU呢?創始人Ryan Dahl建議,運行多個Nodejs進程,利用某些通信機制來協調各項任務。目前,已經有不少第三方的Node.js多進程支持模塊發布,而NodeJS 0.6.x 以上的版本提供了一個cluster模塊 ,允許創建“共享同一個socket”的一組進程,用來分擔負載壓力。

  本篇文章就基于該cluster模塊來講述Node.js在多核CPU下的編程。

  Cluster模塊介紹

  nodejs所提供的cluster模塊目前尚處于試驗階段,在v0.10.7的官方文檔上我們可以看到模塊的發布信息如下:

  Stability: 1 - Experimental

  關于該模塊的功能,源文檔描述如此“A single instance of Node runs in a single thread. To take advantage of multi-core systems the user will sometimes want to launch a cluster of Node processes to handle the load.” 其意就是:Node的示例以單進程的模式運行,有時為了充分利用多核系統的資源用戶需要運行一組Node進程來分擔負載。

  Cluster用法介紹

  首先貼出一段該模塊示例應用代碼,接下來進行詳細分析,代碼如下:

  var cluster = require('cluster');

  var http = require('http');

  var numCPUs = require('os').cpus().length;

  if (cluster.isMaster) {

  require('os').cpus().forEach(function(){

  cluster.fork();

  });

  cluster.on('exit', function(worker, code, signal) {

  console.log('worker ' + worker.process.pid + ' died');

  });

  cluster.on('listening', function(worker, address) {

  console.log("A worker with #"+worker.id+" is now connected to " +

  address.address +

  ":" + address.port);

  });

  } else {

  http.createServer(function(req, res) {

  res.writeHead(200);

  res.end("hello world\n");

  console.log('Worker #' + cluster.worker.id + ' make a response');

  }).listen(8000);

  }

  這段代碼很簡單,主線程就是當前運行的js文件,主線程根據你本機系統的核數來創建子進程。所有進程共享一個監聽端口8000,當有請求發起時,主線程會將該請求隨機分配給某個子進程。console.log('Worker #' + cluster.worker.id + ' make a response');這句代碼可以打印出是哪個進程處理該請求。

  問題分析

  我們前面提到有請求發起時,由系統來決定將該請求交給哪個進程進行處理。這種完全依賴于系統的負載均衡存在著一個重要缺陷:在windows,linux和Solaris上,只要某個子進程的accept queue為空(通常為最后創建的那個子進程),系統就會將多個connetion分配到同一個子進程上,這會造成進程間負載極為不均衡。特別是在使用長連接的時候,單位時間內的new coming connection并不高,子進程的accept queue往往均為空,就會導致connection會不停的分配給同一個進程。所以這種負載均衡完全依賴于accept queue的空閑程度,只有在使用短連接,而且并發非常高的情況下,才能達到負載均衡,但是這個時候系統的load會非常高,系統也會變得不穩定起來。

  Java 中Object的wait() notify() notifyAll()方法使用

  一、前言

  對于并發編程而言,除了Thread以外,對Object對象的wati和notify對象也應該深入了解其用法,雖然知識點不多。

  二、線程安全基本知識

  首先應該記住以下基本點,先背下來也無妨:

  同一時間一個鎖只能被一個線程持有 調用對象的wait()和notify()前必須持有它

  三、wait()和notify()理解

  3.1 wait()和notify()方法簡介

  wait()和notify()都是Object的方法,可以認為任意一個Object都是一種資源(或者資源的一個代表),當多個線程對一個資源進行操作時,如果線程發現這個資源還沒有準備好,它就可以在這個資源上進行等待,即調用這個資源的wait()方法,如果有另外的線程經過某些處理覺得這個資源可用了,會調用這個這個資源的notify()方法,告訴等待它的線程,這個資源可以用了。

  當然不使用wait()和notify()方法也是可以的,可以用while()死循環來判斷,如下面的偽代碼:

  class Resource{

  static boolean canUse=false;

  }

  while(!Resource.canUse){

  //如果不可用,死循環在這里等待

  }

  //當資源可以使用后,就會跳出循環,往下執行

  這樣做是可以,但是特別消耗CPU資源,所以建議用戶使用wait()和notify()方法。

  3.2 wait()和notify()的價值