![](/c49/99/10042953416408.jpg)
店鋪:機械工業出版社官方旗艦店 出版社:機械工業出版社 ISBN:9787111698586 商品編碼:10042953416408 品牌:機械工業出版社(CMP) 頁數:572 字數:234000 審圖號:9787111698586 作者:高洪岩
" 內容簡介 本書作為講解Java多線程技術的教程,主要介紹非常核心並常用的技術點,比如解決線程Thread的停止,線程對像Thread的暫停,線程的優先級,synchronized關鍵字的使用,以及使用它解決非線程安全的問題。使用volatile關鍵字解決變量可見性問題,使用wait()及notify()方法實現等待通知模式,還有使用ThreadLocal類進行隔離變量,Lock鎖對像的使用,包含Condition類實現生產者-消費者模式,深入講解了Condition類在使用上的細節。還包括對Lock鎖對像中的常見API進行細化講解,ReentrantReadWriteLock讀寫鎖的使用等,Timer定時器類的使用。多線程實現單例模式時完整的解決步驟,以及多線程異常的處理等常見Java多線程解決方案。並發集合框架的使用,以及線程池技術點的使用。 目錄 前言 *1章Java多線程技能 1 1.1進程和線程的定義及多線程的優點 1 1.2使用多線程 5 1.2.1繼承Thread類 6 1.2.2使用常見的3個命令分析線程的信息 8 1.2.3線程隨機性的展現 10 1.2.4執行start()的順序不代表執行run()的順序 12 1.2.5實現Runnable接口 14 1.2.6使用Runnable接口實現多線程的優點 15 1.2.7public Thread(Runnable target)中的target參數 16 1.2.8實例變量共享導致的“非線程安全”問題與相應的解決方案 18 1.2.9Servlet技術也會引起“非線程安全”問題 22 1.2.10留意i--與System.out.println()出現的“非線程安全”問題 25 1.2.11方法run()被JVM所調用 27 1.3方法currentThread() 27 1.4方法isAlive() 30 1.5方法sleep(long millis) 33 1.6方法sleep(long millis, int nanos) 34 1.7方法StackTraceElement[] getStack-Trace() 35 1.8方法static void dumpStack() 36 1.9方法Map getAllStackTraces() 37 1.10方法getId() 39 1.11停止線程 40 1.11.1停止不了的線程 41 1.11.2判斷線程是不是停止狀態 42 1.11.3清除中斷狀態的使用場景 44 1.11.4能停止的線程—異常法 48 1.11.5在sleep狀態下停止 51 1.11.6使用stop()暴力停止線程 53 1.11.7方法stop()與java.lang.Thread-Death異常 55 1.11.8使用stop()釋放鎖導致數據結果不一致 57 1.11.9使用return;語句停止線程的缺點及相應的解決方案 59 1.12暫停線程 61 1.12.1方法suspend()與resume()的使用 62 1.12.2方法suspend()與resume()的缺點—獨占 63 1.12.3方法suspend()與resume()的缺點—數據不完整 66 1.12.4使用LockSupport類實現線程暫停與恢復 67 1.13方法yield() 69 1.14線程的優先級 70 1.14.1線程優先級的繼承特性 71 1.14.2線程優先級的規律性 72 1.14.3線程優先級的隨機性 75 1.14.4看誰跑得快 76 1.15守護線程 78 1.16並發與並行 79 1.17同步與異步 80 1.18多核CPU不一定比單核CPU運行快 81 1.19本章小結 82 *2章對像及變量的並發訪問 83 2.1synchronized同步方法 83 2.1.1方法內的變量是線程安全的 83 2.1.2實例變量“非線程安全”問題及解決方案 85 2.1.3同步synchronized在字節碼指令中的原理 88 2.1.4多個對像多個鎖 90 2.1.5synchronized方法將對像作為鎖 92 2.1.6髒讀與解決 97 2.1.7synchronized鎖重入 99 2.1.8繼承環境下的鎖重入 100 2.1.9出現異常,鎖自動釋放 102 2.1.10非同步方法?:不使用synchronized重寫方法 104 2.2synchronized同步語句塊 106 2.2.1synchronized方法的弊端 106 2.2.2synchronized同步代碼塊的使用 109 2.2.3用同步代碼塊解決同步方法的弊端 111 2.2.4一半異步,一半同步 112 2.2.5synchronized代碼塊間的同步性 114 2.2.6方法println()也是同步的 116 2.2.7驗證synchronized(this)同步代碼塊是鎖定當前對像的 117 2.2.8將任意對像作為鎖 119 2.2.9多個鎖就是異步執行 121 2.2.10驗證方法被調用是隨機的 124 2.2.11不同步導致的邏輯錯誤與解決方案 125 2.2.12細化驗證3個結論 129 2.2.13類對像的單例性 134 2.2.14靜態同步?:synchronized方法與synchronized(class)代碼塊 135 2.2.15同步synchronized方法可以對類的所有對像實例起作用 139 2.2.16同步synchronized(class)代碼塊可以對類的所有對像實例起作用 141 2.2.17String常量池特性與同步問題 143 2.2.18synchronized方法無限等待問題與解決方案 146 2.2.19多線程的死鎖 148 2.2.20內置類與靜態內置類 150 2.2.21內置類與同步?:實驗1 153 2.2.22內置類與同步?:實驗2 155 2.2.23鎖對像改變導致異步執行 156 2.2.24鎖對像不改變依然是同步執行 159 2.2.25同步寫法案例比較 161 2.2.26方法holdsLock(Object obj)的使用 161 2.2.27臨界區 162 2.3volatile關鍵字 162 2.3.1可見性的測試 163 2.3.2原子性與非原子性的測試 171 2.3.3禁止代碼重排序的測試 179 2.4本章小結 190 第3章線程間通信 191 3.1wait/ notify機制 191 3.1.1不使用wait/notify機制進行通信的缺點 191 3.1.2什麼是wait/notify機制 194 3.1.3wait/notify機制的原理 194 3.1.4方法wait()的基本用法 195 3.1.5使用代碼完整實現wait /notify機制 196 3.1.6使用wait/notify機制實現線程銷毀 198 3.1.7對業務代碼進行封裝 200 3.1.8線程狀態的切換 203 3.1.9方法wait()導致鎖立即釋放 204 3.1.10方法sleep()不釋放鎖 206 3.1.11方法notify()不立即釋放鎖 206 3.1.12方法interrupt()遇到方法wait() 208 3.1.13方法notify()隻通知一個線程 210 3.1.14方法notifyAll()通知所有線程 212 3.1.15方法wait(long)的基本用法 213 3.1.16方法wait(long)自動向下運行的條件 215 3.1.17通知過早與相應的解決方案 218 3.1.18等待條件發生變化 220 3.1.19生產者/消費者模式實現 224 3.1.20在管道中傳遞字節流 239 3.1.21在管道中傳遞字符流 241 3.1.22利用wait/notify機制實現交叉備份 244 3.1.23方法sleep()和wait()的區別 247 3.2方法join()的使用 247 3.2.1學習方法join()前的鋪墊 247 3.2.2用方法join()解決問題 248 3.2.3方法join()和interrupt()出現異常 250 3.2.4方法join(long)的使用 252 3.2.5方法join(long)與sleep(long)的區別 254 3.2.6方法join()後的代碼提前運行 257 3.2.7方法join(long millis, int nanos)的使用 261 3.3類ThreadLocal的使用 262 3.3.1方法get()與null 262 3.3.2類ThreadLocal存取數據流程分析 263 3.3.3驗證線程變量的隔離性 266 3.3.4解決get()返回null的問題 270 3.3.5驗證重寫initialValue()方法的隔離性 271 3.3.6使用remove()方法的必要性 272 3.4類InheritableThreadLocal的使用 276 3.4.1類ThreadLocal不能實現值繼承 277 3.4.2使用InheritableThreadLocal體現值繼承特性 278 3.4.3值繼承特性在源代碼中的執行流程 280 3.4.4父線程有*新的值,子線程還是舊值?:不可變類型 285 3.4.5子線程有*新的值,父線程還是舊值?:不可變類型 286 3.4.6子線程可以感應對像屬性值的變化?:可變類型 288 3.4.7重寫childValue方法實現對繼承值的加工 291 3.5本章小結 291 第4章鎖的使用 292 4.1使用ReentrantLock類 292 4.1.1使用ReentrantLock實現同步 292 4.1.2驗證多代碼塊間的同步性 294 4.1.3方法await()的錯誤用法與相應的解決方案 297 4.1.4使用方法await()和方法signal()實現wait/notify 300 4.1.5方法await()暫停的原理 302 4.1.6通知部分線程?:錯誤用法 306 4.1.7通知部分線程?:正確用法 308 4.1.8實現生產者/消費者模式一對一交替打印 311 4.1.9實現生產者/消費者模式多對多交替打印 313 4.1.10公平鎖與非公平鎖 315 4.1.11方法getHoldCount()的使用 318 4.1.12方法getQueueLength()的使用 319 4.1.13方法getWaitQueueLength(Condition condition)的使用 321 4.1.14方法hasQueuedThread(Thread thread)的使用 322 4.1.15方法hasQueuedThreads()的使用 323 4.1.16方法hasWaiters(Condition condition)的使用 324 4.1.17方法isFair()的使用 326 4.1.18方法isHeldByCurrentThread()的使用 326 4.1.19方法isLocked()的使用 327 4.1.20方法lockInterruptibly()的使用 328 4.1.21方法tryLock()的使用 330 4.1.22方法tryLock(long timeout, Time-Unit unit)的使用 331 4.1.23方法await(long time, TimeUnit unit)的使用 333 4.1.24方法awaitNanos(long nanos-Timeout)的使用 334 4.1.25方法awaitUntil(Date deadline)的使用 335 4.1.26方法awaitUninterruptibly()的使用 337 4.1.27實現線程按順序執行業務 339 4.2使用ReentrantReadWriteLock類 342 4.2.1類ReentrantLock的缺點 342 4.2.2讀讀共享 344 4.2.3寫寫互斥 344 4.2.4讀寫互斥 345 4.2.5寫讀互斥 346 4.3本章小結 347 第5章定時器 348 5.1定時器的使用 348 5.1.1方法schedule(TimerTask task, Date time)的測試 349 5.1.2方法schedule(TimerTask task, Date f?irstTime, long period)的測試 357 5.1.3方法schedule(TimerTask task, long delay)的測試 365 5.1.4方法schedule(TimerTask task, long delay, long period)的測試 365 5.1.5方法scheduleAtFixedRate(TimerTask task, Date f?irst-Time, long period)的測試 366 5.2本章小結 374 第6章單例模式與多線程 375 6.1單例模式與多線程 375 6.1.1立即加載/餓漢模式 375 6.1.2延遲加載/懶漢模式 377 6.1.3使用靜態內置類實現單例模式 388 6.1.4序列化與反序列化的單例模式實現 389 6.1.5使用static代碼塊實現單例模式 392 6.1.6使用enum枚舉數據類型實現單例模式 393 6.1.7完善使用enum枚舉實現單例模式 394 6.2本章小結 396 第7章拾遺增補 397 7.1線程的狀態 397 7.1.1驗證NEW、RUNNABLE和TERMINATED 399 7.1.2驗證TIMED_WAITING 400 7.1.3驗證BLOCKED 401 7.1.4驗證WAITING 403 7.2線程組 404 7.2.1線程對像關聯線程組?:一級關聯 404 7.2.2線程對像關聯線程組?:多級關聯 406 7.2.3線程組自動歸屬特性 407 7.2.4獲取根線程組 408 7.2.5線程組內加線程組 409 7.2.6組內的線程批量停止 409 7.2.7遞歸取得與非遞歸取得組內對像 410 7.3Thread.activeCount()方法的使用 412 7.4Thread.enumerate(Thread tarray[])方法的使用 412 7.5再次驗證線程執行有序性 412 7.6類SimpleDateFormat非線程安全 414 7.6.1出現異常 415 7.6.2解決方法1 417 7.6.3解決方法2 418 7.7線程中出現異常的處理 420 7.7.1線程出現異常的默認行為 420 7.7.2使用setUncaughtException-Handler()方法進行異常處理 421 7.7.3使用setDefaultUncaught-ExceptionHandler()方法進行異常處理 422 7.8線程組內處理異常 423 7.9線程異常處理的優先性 426 7.10本章小結 431 第8章並發集合框架 432 8.1集合框架結構 432 8.1.1接口Iterable 432 8.1.2接口Collection 432 8.1.3接口List 433 8.1.4接口Set 434 8.1.5接口Queue 435 8.1.6接口Deque 435 8.2非阻塞隊列 435 8.2.1類ConcurrentHashMap的使用 436 8.2.2類ConcurrentSkipListMap的使用 442 8.2.3類ConcurrentSkipListSet的使用 444 8.2.4類ConcurrentLinkedQueue的使用 447 8.2.5類ConcurrentLinkedDeque的使用 451 8.2.6類CopyOnWriteArrayList的使用 453 8.2.7類CopyOnWriteArraySet的使用 454 8.3阻塞隊列 456 8.3.1類ArrayBlockingQueue與公平/非公平鎖的使用 456 8.3.2類PriorityBlockingQueue的使用 461 8.3.3類LinkedBlockingQueue的使用 463 8.3.4類LinkedBlockingDeque的使用 463 8.3.5類SynchronousQueue的使用 463 8.3.6類DelayQueue的使用 466 8.3.7類LinkedTransferQueue的使用 467 8.4本章小結 476 第9章線程池類ThreadPoolExecutor的使用 477 9.1Executor接口介紹 477 9.2使用Executors工廠類創建線程池 481 9.2.1使用newCachedThreadPool()方法創建無界線程池 481 9.2.2驗證newCachedThreadPool()方法創建線程池和線程復用特性 483 9.2.3使用newCachedThreadPool (ThreadFactory)方法定制線程工廠 486 9.2.4使用newCachedThread-Pool()方法創建無界線程池的缺點 487 9.2.5使用newFixedThreadPool(int) 方法創建有界線程池 488 9.2.6使用newSingleThread-Executor()方法創建單一線程池 490 9.3ThreadPoolExecutor類的使用 491 9.3.1隊列LinkedBlocking-Queue、ArrayBlocking-Queue和Synchronous-Queue的基本使用 491 9.3.2構造方法參數詳解 495 9.3.3方法shutdown()和shutdownNow() 521 9.3.4方法List shutdown-Now()返回值的作用 525 9.3.5方法shutdown()和shutdown-Now()與中斷 527 9.3.6方法isShutdown() 529 9.3.7方法isTerminating()和isTerminated() 530 9.3.8方法awaitTermination(long timeout,TimeUnit unit) 531 9.3.9工廠ThreadFactory+Thread+UncaughtExceptionHandler處理異常 533 9.3.10方法set/getRejected-ExecutionHandler() 537 9.3.11方法allowsCoreThreadTime-Out和allowCoreThreadTime-Out(bool) 539 9.3.12方法prestartCoreThread()和prestartAllCoreThreads() 541 9.3.13方法getCompletedTask-Count() 542 9.3.14線程池ThreadPoolExecutor的拒絕策略 543 9.3.15方法afterExecute()和beforeExecute() 549 9.3.16方法remove(Runnable)的使用 551 9.3.17多個get方法的測試 555 9.4本章小結 558
" |