Java與模式清晰完整版
現在還能下
http://www.shubulo.com/viewthread.php?tid=29221
『貳』 java零基礎入門書籍有哪些值得推薦
四大名著之《Java核心技術(第10版)》
提起Java入門必讀,四大名著是少不了的。《Java 核心技術》就是其中之一,分卷一、卷二兩冊,卷一講基礎,卷二為進階。全書對於Java語言的核心概念、語法、重要特性和開發方法講解地非常細致,可以說是一部有關Java的網路全書。
四大名著之《EffectiveJava中文版(第 2 版)》
「神書」、「整本書都是精華」、「內容永不過時」、「Java 程序員必讀」……這些標簽都是屬於《Effective Java中文版》的。
這本書不是講理論基礎的,而是講實戰的。書中介紹了78條極具實用價值的經驗規則,涵蓋了大多數開發人員每天所面臨的問題的解決方案,並且通過代碼例子進一步進行佐證,讓你知其然,也知其所以然。
哪怕不是Java程序員,也能買來看看,書中絕妙的編程觀是跨語言、跨平台的。
四大名著之《Java 編程思想(第 4 版)》
這同樣是一本Java領域的經典書籍,從Java編程的基礎知識點開始講起,慢慢深入,一直到Java的高級特性。作者用了大量通俗易懂的代碼對理論進行佐證,讓讀者在實際操作中可以深入理解操作符、枚舉類型、介面等相關知識。
這是一本被廣大讀者評價為「不管什麼時候閱讀都會有收獲」的書,不論你是否剛接觸 Java,都可以在閱讀中獲得啟迪。
《深入理解Java虛擬機:JVM 高級特性與最佳實踐(第 2 版)》
用Java卻不懂JVM是說不過去的,但市面上有關JVM 的書很少,這本書更是少有的國內講解此方面備受好評的書,甚至可以說是JVM書籍最好的讀物之一。
本書整體內容更偏向實戰,難易適中。從內存管理、執行子系統、程序編譯與優化、高效並發等核心主題講解JVM。第2版根據JDK1.7進行了內容升級,整體上不光適合入門,而且對於已經接觸JVM的人來說,也會常讀常新。
《Java語言程序設計(基礎篇)(原書第 10 版)》
這應該是很多程序員,尤其是Java程序員倍感親切的書,因為這本書可以說是他們當中很多人的入門初心。
本書從最基本的程序理論知識出發,哪怕你完全沒有Java基礎,也可以通過這本書了解Java基本的程序設計、語言結構、面對對象程序設計等知識。書中還配了大量的代碼和課後習題,讓讀者在了解有關Java的基礎知識的時候,也能進行實踐深入理解。
非常適合零基礎、Java 和編程愛好者來讀。
《Java 高並發編程詳解:多線程與架構設計》
全書主要分為四個部分:第一部分主要闡述Thread的基礎知識;第二部分引入了 ClassLoader;第三部分詳細、深入地介紹volatile關鍵字的語義;第四部分也是最重要的一部分,站在程序架構設計的角度深入講解了如何設計高效靈活的多線程應用程序。
上述就是推薦的幾本學Java要看的書籍。
『叄』 關於java學習,有什麼書籍或者教程推薦不啦
你好,如果想學習java,推薦自學。如果覺得自己沒有自製力,可以去報個培育班,那裡有人教,會更好點。至於書的話,有很多的,比如說java編程思想等等,要結合自己的實際需要來選擇,然後就是努力了。祝你學有所成!
『肆』 請教,推薦幾本java類書籍
1、《Effective Java(第三版)》(Effective Java 3rd Edition)
如果你還沒讀過這本書,那它絕對是 2019 年你必須讀的第一本書。第三版是一個長期版本,其實它早就該出版了。這版書也囊括了 JDK 7、8、9 的新特性。
我在 1 月份的第一個星期就拿到了這本書,它絕對是約書亞·布洛克(Joshua Bloch)給 Java 程序員非常好的新年禮物。
我花了大概一個星期就讀完了這本書。我發現讀的過程中,時常碰到新的知識點,特別是關於 Java 8 和 Java 9 的。
2、《寫給大忙人看的Java SE 9(第二版)》 (Core Java SE 9 for the Impatient (2nd Edition))
如果你急著學 Java 那我推薦這本書給你。我是凱 S·霍斯特曼 (Cay S. Horstmann)的一個忠實粉絲,他的文采之優美、涉獵之廣,都讓我很是佩服。
你讀了他寫的關於 Java 8、Scala 的書以及《Java 核心編程》之後,絕對也會成為他的粉絲。這本書已經針對 Java SE 9 全面更新。如果你想學習 Java 9,那2018年你應該先讀讀這本書。
3、《Spring 微服務實戰》(Spring Microservices in Action)
軟體開發世界正在加速轉向微服務架構,它在開發、維護、部署、擴容性及可靠性等方面有很多優勢。
感謝 Spring framework 提供這么多開發微服務的 Java 工具,比如 Spring Boot 和 Spring Cloud。
如果你對用 Spring framework 開發微服務有興趣,那麼這本書很適合你。
2019年Java學習,依舊正在進行時,身為一個踏入Java坑的老碼農,深感技術學習就是一個無底洞,需要不斷的去挖掘新的技術,為了跟上時代的發展,需要時時關注技術更新,進行學習,不過隨著技術的不斷深入學習,收獲還是不小的,正在向著資深技術官邁進!
『伍』 java的不同學習階段
我說一下我的學習過程:
1,java么? 目前就是web開發和無線開發這兩種,看你自己的選擇了。WEB應用是主流,也比較好找工作。
2,不管幹什麼基礎是最重要的。我說說我的心得。WEB開發一定要看的書:
1)基礎好點的可以看《JAVA編程思想》3,4版都行。
2)有點水平了可以看《effective java》。
3)《JSP與servlet核心編程》這個看過後,基本對web就比較熟悉了。
4)如果再想提高就看看閻宏的《JAVA模式》,裡面不一定都正確,主要是理解思想。
5)以上看的差不多了,就再看看《SPRING技術指南》,其實不看也無所謂,把如何利用反射機制實現IOC,AOP的原理弄明白了就行了。說實話,AOP不怎麼常用,主要是IOC。
6)以上都看過後,就要多實踐了,最好找找項目做做。這期間為了提高代碼水平,可以看這兩本書《代碼大全》和Rod Johnson前輩的《Expert One-on-One J2EE Design and Development》中文版,翻譯上有時候不太好,不過還算能接受。
7)再之後就是常常上論壇JAVAEYE,CSDN逛逛。
看看常用的WEB框架,前端一些框架,SSH盡量少看吧~~ 沒必要,最最重要的是學習人家的套路和思想。框架如何組織的。
我目前用的是velocity + ibatis + mysql集群 + 一個自己的框架
『陸』 什麼是Java設計模式
設計模式只是一種形式
分很多種
分很多步驟
比如JAVA多線程設計模式等
很多種
你可以找找書去看
太多了
沒發具體回答你的問題
『柒』 JAVA 的線程這塊咋整啊,咋也學不明白啊~~
線程!我把我理解的簡單的很你說說也許有點用
理解線程和進程的區別 先可以理解為線程組成進程
首先也是類是個
他的實例化有一般兩種方法:一是繼承thread一種是實現借口runable
他的方法有start sleep run wait stop等
一、進程與應用程序的區別
進程(Process)是最初定義在Unix等多用戶、多任務操作系統環境下用於表示應用程序在內存環境中基本執行單元的概念。以Unix操作系統為例,進程是Unix操作系統環境中的基本成分、是系統資源分配的基本單位。Unix操作系統中完成的幾乎所有用戶管理和資源分配等工作都是通過操作系統對應用程序進程的控制來實現的。
C、C++、Java等語言編寫的源程序經相應的編譯器編譯成可執行文件後,提交給計算機處理器運行。這時,處在可執行狀態中的應用程序稱為進程。從用戶角度來看,進程是應用程序的一個執行過程。從操作系統核心角度來看,進程代表的是操作系統分配的內存、CPU時間片等資源的基本單位,是為正在運行的程序提供的運行環境。進程與應用程序的區別在於應用程序作為一個靜態文件存儲在計算機系統的硬碟等存儲空間中,而進程則是處於動態條件下由操作系統維護的系統資源管理實體。多任務環境下應用程序進程的主要特點包括:
●進程在執行過程中有內存單元的初始入口點,並且進程存活過程中始終擁有獨立的內存地址空間;
●進程的生存期狀態包括創建、就緒、運行、阻塞和死亡等類型;
●從應用程序進程在執行過程中向CPU發出的運行指令形式不同,可以將進程的狀態分為用戶態和核心態。處於用戶態下的進程執行的是應用程序指令、處於核心態下的應用程序進程執行的是操作系統指令。
在Unix操作系統啟動過程中,系統自動創建swapper、init等系統進程,用於管理內存資源以及對用戶進程進行調度等。在Unix環境下無論是由操作系統創建的進程還要由應用程序執行創建的進程,均擁有唯一的進程標識(PID)。
二、進程與Java線程的區別
應用程序在執行過程中存在一個內存空間的初始入口點地址、一個程序執行過程中的代碼執行序列以及用於標識進程結束的內存出口點地址,在進程執行過程中的每一時間點均有唯一的處理器指令與內存單元地址相對應。
Java語言中定義的線程(Thread)同樣包括一個內存入口點地址、一個出口點地址以及能夠順序執行的代碼序列。但是進程與線程的重要區別在於線程不能夠單獨執行,它必須運行在處於活動狀態的應用程序進程中,因此可以定義線程是程序內部的具有並發性的順序代碼流。
Unix操作系統和Microsoft Windows操作系統支持多用戶、多進程的並發執行,而Java語言支持應用程序進程內部的多個執行線程的並發執行。多線程的意義在於一個應用程序的多個邏輯單元可以並發地執行。但是多線程並不意味著多個用戶進程在執行,操作系統也不把每個線程作為獨立的進程來分配獨立的系統資源。進程可以創建其子進程,子進程與父進程擁有不同的可執行代碼和數據內存空間。而在用於代表應用程序的進程中多個線程共享數據內存空間,但保持每個線程擁有獨立的執行堆棧和程序執行上下文(Context)。
基於上述區別,線程也可以稱為輕型進程 (Light Weight Process,LWP)。不同線程間允許任務協作和數據交換,使得在計算機系統資源消耗等方面非常廉價。
線程需要操作系統的支持,不是所有類型的計算機都支持多線程應用程序。Java程序設計語言將線程支持與語言運行環境結合在一起,提供了多任務並發執行的能力。這就好比一個人在處理家務的過程中,將衣服放到洗衣機中自動洗滌後將大米放在電飯鍋里,然後開始做菜。等菜做好了,飯熟了同時衣服也洗好了。
需要注意的是:在應用程序中使用多線程不會增加 CPU 的數據處理能力。只有在多CPU 的計算機或者在網路計算體系結構下,將Java程序劃分為多個並發執行線程後,同時啟動多個線程運行,使不同的線程運行在基於不同處理器的Java虛擬機中,才能提高應用程序的執行效率。
另外,如果應用程序必須等待網路連接或資料庫連接等數據吞吐速度相對較慢的資源時,多線程應用程序是非常有利的。基於Internet的應用程序有必要是多線程類型的,例如,當開發要支持大量客戶機的伺服器端應用程序時,可以將應用程序創建成多線程形式來響應客戶端的連接請求,使每個連接用戶獨佔一個客戶端連接線程。這樣,用戶感覺伺服器只為連接用戶自己服務,從而縮短了伺服器的客戶端響應時間。
三、Java語言的多線程程序設計方法
利用Java語言實現多線程應用程序的方法很簡單。根據多線程應用程序繼承或實現對象的不同可以採用兩種方式:一種是應用程序的並發運行對象直接繼承Java的線程類Thread;另外一種方式是定義並發執行對象實現Runnable介面。
繼承Thread類的多線程程序設計方法
Thread 類是JDK中定義的用於控制線程對象的類,在該類中封裝了用於進行線程式控制制的方法。見下面的示例代碼:
[code]//Consumer.java
import java.util.*;
class Consumer extends Thread
{
int nTime;
String strConsumer;
public Consumer(int nTime, String strConsumer)
{
this.nTime = nTime;
this.strConsumer = strConsumer;
}
public void run()
{
while(true)
{
try
{
System.out.println("Consumer name:"+strConsumer+"\n");
Thread.sleep(nTime);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
static public void main(String args[])
{
Consumer aConsumer = new Consumer (1000, "aConsumer");
aConsumer.start();
Consumer bConsumer = new Consumer (2000, "bConsumer");
bConsumer.start();
Consumer cConsumer = new Consumer (3000, "cConsumer ");
cConsumer.start();
}
} [/code]
從上面的程序代碼可以看出:多線程執行地下Consumer繼承Java語言中的線程類Thread並且在main方法中創建了三個Consumer對象的實例。當調用對象實例的start方法時,自動調用Consumer類中定義的run方法啟動對象線程運行。線程運行的結果是每間隔nTime時間列印出對象實例中的字元串成員變數strConsumer的內容。
可以總結出繼承Thread類的多線程程序設計方法是使應用程序類繼承Thread類並且在該類的run方法中實現並發性處理過程。
實現Runnable介面的多線程程序設計方法
Java語言中提供的另外一種實現多線程應用程序的方法是多線程對象實現Runnable介面並且在該類中定義用於啟動線程的run方法。這種定義方式的好處在於多線程應用對象可以繼承其它對象而不是必須繼承Thread類,從而能夠增加類定義的邏輯性。
實現Runnable介面的多線程應用程序框架代碼如下所示:
//Consumer.java
import java.util.*;
class Consumer implements Runnable
{
… …
public Consumer(int nTime, String strConsumer){… …}
public void run(){… …}
static public void main(String args[])
{
Thread aConsumer = new Thread(new Consumer(1000, "aConsumer"));
aConsumer.start();
//其它對象實例的運行線程
//… …
}
}
從上述代碼可以看出:該類實現了Runnable介面並且在該類中定義了run方法。這種多線程應用程序的實現方式與繼承Thread類的多線程應用程序的重要區別在於啟動多線程對象的方法設計方法不同。在上述代碼中,通過創建Thread對象實例並且將應用對象作為創建Thread類實例的參數。
四、線程間的同步
Java應用程序的多個線程共享同一進程的數據資源,多個用戶線程在並發運行過程中可能同時訪問具有敏感性的內容。在Java中定義了線程同步的概念,實現對共享資源的一致性維護。下面以筆者最近開發的移動通信計費系統中線程間同步控制方法,說明Java語言中多線程同步方式的實現過程。
在沒有多線程同步控制策略條件下的客戶賬戶類定義框架代碼如下所示:
public class RegisterAccount
{
float fBalance;
//客戶繳費方法
public void deposit(float fFees){ fBalance += fFees; }
//通話計費方法
public void withdraw(float fFees){ fBalance -= fFees; }
… …
}
讀者也許會認為:上述程序代碼完全能夠滿足計費系統實際的需要。確實,在單線程環境下該程序確實是可靠的。但是,多進程並發運行的情況是怎樣的呢?假設發生這種情況:客戶在客戶服務中心進行繳費的同時正在利用移動通信設備僅此通話,客戶通話結束時計費系統啟動計費進程,而同時服務中心的工作人員也提交繳費進程運行。讀者可以看到如果發生這種情況,對客戶賬戶的處理是不嚴肅的。
如何解決這種問題呢?很簡單,在RegisterAccount類方法定義中加上用於標識同步方法的關鍵字synchronized。這樣,在同步方法執行過程中該方法涉及的共享資源(在上述代碼中為fBalance成員變數)將被加上共享鎖,以確保在方法運行期間只有該方法能夠對共享資源進行訪問,直到該方法的線程運行結束打開共享鎖,其它線程才能夠訪問這些共享資源。在共享鎖沒有打開的時候其它訪問共享資源的線程處於阻塞狀態。
進行線程同步策略控制後的RegisterAccount類定義如下面代碼所示:
public class RegisterAccount
{
float fBalance;
public synchronized void deposit(float fFees){ fBalance += fFees; }
public synchronized void withdraw(float fFees){ fBalance -= fFees; }
… …
}
從經過線程同步機制定義後的代碼形式可以看出:在對共享資源進行訪問的方法訪問屬性關鍵字(public)後附加同步定義關鍵字synchronized,使得同步方法在對共享資源訪問的時候,為這些敏感資源附加共享鎖來控制方法執行期間的資源獨占性,實現了應用系統數據資源的一致性管理和維護。
五、 Java線程的管理
線程的狀態控制
在這里需要明確的是:無論採用繼承Thread類還是實現Runnable介面來實現應用程序的多線程能力,都需要在該類中定義用於完成實際功能的run方法,這個run方法稱為線程體(Thread Body)。按照線程體在計算機系統內存中的狀態不同,可以將線程分為創建、就緒、運行、睡眠、掛起和死亡等類型。這些線程狀態類型下線程的特徵為:
創建狀態:當利用new關鍵字創建線程對象實例後,它僅僅作為一個對象實例存在,JVM沒有為其分配CPU時間片等線程運行資源;
就緒狀態:在處於創建狀態的線程中調用start方法將線程的狀態轉換為就緒狀態。這時,線程已經得到除CPU時間之外的其它系統資源,只等JVM的線程調度器按照線程的優先順序對該線程進行調度,從而使該線程擁有能夠獲得CPU時間片的機會。
睡眠狀態:在線程運行過程中可以調用sleep方法並在方法參數中指定線程的睡眠時間將線程狀態轉換為睡眠狀態。這時,該線程在不釋放佔用資源的情況下停止運行指定的睡眠時間。時間到達後,線程重新由JVM線程調度器進行調度和管理。
掛起狀態:可以通過調用suspend方法將線程的狀態轉換為掛起狀態。這時,線程將釋放佔用的所有資源,由JVM調度轉入臨時存儲空間,直至應用程序調用resume方法恢復線程運行。
死亡狀態:當線程體運行結束或者調用線程對象的stop方法後線程將終止運行,由JVM收回線程佔用的資源。
在Java線程類中分別定義了相應的方法,用於在應用程序中對線程狀態進行控制和管理。
線程的調度
線程調用的意義在於JVM應對運行的多個線程進行系統級的協調,以避免多個線程爭用有限資源而導致應用系統死機或者崩潰。
為了線程對於操作系統和用戶的重要性區分開,Java定義了線程的優先順序策略。Java將線程的優先順序分為10個等級,分別用1-10之間的數字表示。數字越大表明線程的級別越高。相應地,在Thread類中定義了表示線程最低、最高和普通優先順序的成員變數MIN_PRIORITY、MAX_PRIORITY和NORMAL_PRIORITY,代表的優先順序等級分別為1、10和5。當一個線程對象被創建時,其默認的線程優先順序是5。
為了控制線程的運行策略,Java定義了線程調度器來監控系統中處於就緒狀態的所有線程。線程調度器按照線程的優先順序決定那個線程投入處理器運行。在多個線程處於就緒狀態的條件下,具有高優先順序的線程會在低優先順序線程之前得到執行。線程調度器同樣採用"搶占式"策略來調度線程執行,即當前線程執行過程中有較高優先順序的線程進入就緒狀態,則高優先順序的線程立即被調度執行。具有相同優先順序的所有線程採用輪轉的方式來共同分配CPU時間片。
在應用程序中設置線程優先順序的方法很簡單,在創建線程對象之後可以調用線程對象的setPriority方法改變該線程的運行優先順序,同樣可以調用getPriority方法獲取當前線程的優先順序。
在Java中比較特殊的線程是被稱為守護(Daemon)線程的低級別線程。這個線程具有最低的優先順序,用於為系統中的其它對象和線程提供服務。將一個用戶線程設置為守護線程的方式是在線程對象創建之前調用線程對象的setDaemon方法。典型的守護線程例子是JVM中的系統資源自動回收線程,它始終在低級別的狀態中運行,用於實時監控和管理系統中的可回收資源。
線程分組管理
Java定義了在多線程運行系統中的線程組(ThreadGroup)對象,用於實現按照特定功能對線程進行集中式分組管理。用戶創建的每個線程均屬於某線程組,這個線程組可以在線程創建時指定,也可以不指定線程組以使該線程處於默認的線程組之中。但是,一旦線程加入某線程組,該線程就一直存在於該線程組中直至線程死亡,不能在中途改變線程所屬的線程組。
當Java的Application應用程序運行時,JVM創建名稱為main的線程組。除非單獨指定,在該應用程序中創建的線程均屬於main線程組。在main線程組中可以創建其它名稱的線程組並將其它線程加入到該線程組中,依此類推,構成線程和線程組之間的樹型管理和繼承關系。
與線程類似,可以針對線程組對象進行線程組的調度、狀態管理以及優先順序設置等。在對線程組進行管理過程中,加入到某線程組中的所有線程均被看作統一的對象。
六、小結:
本文針對Java平台中線程的性質和應用程序的多線程策略進行了分析和講解。
與其它操作系統環境不同,Java運行環境中的線程類似於多用戶、多任務操作系統環境下的進程,但在進程和線程的運行及創建方式等方面,進程與Java線程具有明顯區別。
Unix操作系統環境下,應用程序可以利用fork函數創建子進程,但子進程與該應用程序進程擁有獨立的地址空間、系統資源和代碼執行單元,並且進程的調度是由操作系統來完成的,使得在應用進程之間進行通信和線程協調相對復雜。而Java應用程序中的多線程則是共享同一應用系統資源的多個並行代碼執行體,線程之間的通信和協調方法相對簡單。
可以說:Java語言對應用程序多線程能力的支持增強了Java作為網路程序設計語言的優勢,為實現分布式應用系統中多客戶端的並發訪問以及提高伺服器的響應效率奠定堅實基礎。
Java的線程編程非常簡單。但有時會看到一些關於線程的錯誤用法。下面列出一些應該注意的問題。
1.同步對象的恆定性
All java objects are references.
對於局部變數和參數來說,java裡面的int, float, double, boolean等基本數據類型,都在棧上。這些基本類型是無法同步的;java裡面的對象(根對象是Object),全都在堆里,指向對象的reference在棧上。
java中的同步對象,實際上是對於reference所指的「對象地址」進行同步。
需要注意的問題是,千萬不要對同步對象重新賦值。舉個例子。
class A implements Runnable{
Object lock = new Object();
void run(){
for(...){
synchronized(lock){
// do something
...
lock = new Object();
}
}
}
run函數裡面的這段同步代碼實際上是毫無意義的。因為每一次lock都給重新分配了新的對象的reference,每個線程都在新的reference同步。
大家可能覺得奇怪,怎麼會舉這么一個例子。因為我見過這樣的代碼,同步對象在其它的函數里被重新賦了新值。
這種問題很難查出來。
所以,一般應該把同步對象聲明為final.
final Object lock = new Object();
使用Singleton Pattern 設計模式來獲取同步對象,也是一種很好的選擇。
2.如何放置共享數據
實現線程,有兩種方法,一種是繼承Thread類,一種是實現Runnable介面。
上面舉的例子,採用實現Runnable介面的方法。本文推薦這種方法。
首先,把需要共享的數據放在一個實現Runnable介面的類裡面,然後,把這個類的實例傳給多個Thread的構造方法。這樣,新創建的多個Thread,都共同擁有一個Runnable實例,共享同一份數據。
如果採用繼承Thread類的方法,就只好使用static靜態成員了。如果共享的數據比較多,就需要大量的static靜態成員,令程序數據結構混亂,難以擴展。這種情況應該盡量避免。
編寫一段多線程代碼,處理一個稍微復雜點的問題。兩種方法的優劣,一試便知。
3.同步的粒度
線程同步的粒度越小越好,即,線程同步的代碼塊越小越好。盡量避免用synchronized修飾符來聲明方法。盡量使用synchronized(anObject)的方式,如果不想引入新的同步對象,使用synchronized(this)的方式。而且,synchronized代碼塊越小越好。
4.線程之間的通知
這里使用「通知」這個詞,而不用「通信」這個詞,是為了避免詞義的擴大化。
線程之間的通知,通過Object對象的wait()和notify() 或notifyAll() 方法實現。
下面用一個例子,來說明其工作原理:
假設有兩個線程,A和B。共同擁有一個同步對象,lock。
1.首先,線程A通過synchronized(lock) 獲得lock同步對象,然後調用lock.wait()函數,放棄lock同步對象,線程A停止運行,進入等待隊列。
2.線程B通過synchronized(lock) 獲得線程A放棄的lock同步對象,做完一定的處理,然後調用 lock.notify() 或者lock.notifyAll() 通知等待隊列裡面的線程A。
3.線程A從等待隊列裡面出來,進入ready隊列,等待調度。
4.線程B繼續處理,出了synchronized(lock)塊之後,放棄lock同步對象。
5.線程A獲得lock同步對象,繼續運行。
例子代碼如下:
public class SharedResource implements Runnable{
Object lock = new Object();
public void run(){
// 獲取當前線程的名稱。
String threadName = Thread.currentThread().getName();
if( 「A」.equals(threadName)){
synchronized(lock){ //線程A通過synchronized(lock) 獲得lock同步對象
try{
System.out.println(「 A gives up lock.」);
lock.wait(); // 調用lock.wait()函數,放棄lock同步對象,
// 線程A停止運行,進入等待隊列。
}catch(InterruptedException e){
}
// 線程A重新獲得lock同步對象之後,繼續運行。
System.out.println(「 A got lock again and continue to run.」);
} // end of synchronized(lock)
}
if( 「B」.equals(threadName)){
synchronized(lock){//線程B通過synchronized(lock) 獲得線程A放棄的lock同步對象
System.out.println(「B got lock.」);
lock.notify(); //通知等待隊列裡面的線程A,進入ready隊列,等待調度。
//線程B繼續處理,出了synchronized(lock)塊之後,放棄lock同步對象。
System.out.println(「B gives up lock.」);
} // end of synchronized(lock)
boolean hasLock = Thread.holdsLock(lock); // 檢查B是否擁有lock同步對象。
System.out.println(「B has lock ? -- 」 +hasLock); // false.
}
}
}
public class TestMain{
public static void main(){
Runnable resource = new SharedResource();
Thread A = new Thread(resource,」A」);
A.start();
// 強迫主線程停止運行,以便線程A開始運行。
try {
Thread.sleep(500);
}catch(InterruptedException e){
}
Thread B = new Thread(resource,」B」);
B.start();
}
}
5.跨類的同步對象
對於簡單的問題,可以把訪問共享資源的同步代碼都放在一個類裡面。
但是對於復雜的問題,我們需要把問題分為幾個部分來處理,需要幾個不同的類來處理問題。這時,就需要在不同的類中,共享同步對象。比如,在生產者和消費者之間共享同步對象,在讀者和寫者之間共享同步對象。
如何在不同的類中,共享同步對象。有幾種方法實現,
(1)前面講過的方法,使用static靜態成員,(或者使用Singleton Pattern.)
(2)用參數傳遞的方法,把同步對象傳遞給不同的類。
(3)利用字元串常量的「原子性」。
對於第三種方法,這里做一下解釋。一般來說,程序代碼中的字元串常量經過編譯之後,都具有唯一性,即,內存中不會存在兩份相同的字元串常量。
(通常情況下,C++,C語言程序編譯之後,也具有同樣的特性。)
比如,我們有如下代碼。
String A = 「atom」;
String B = 「atom」;
我們有理由認為,A和B指向同一個字元串常量。即,A==B。
注意,聲明字元串變數的代碼,不符合上面的規則。
String C= new String(「atom」);
String D = new String(「atom」);
這里的C和D的聲明是字元串變數的聲明,所以,C != D。
有了上述的認識,我們就可以使用字元串常量作為同步對象。
比如我們在不同的類中,使用synchronized(「myLock」), 「myLock」.wait(),「myLock」.notify(), 這樣的代碼,就能夠實現不同類之間的線程同步。
本文並不強烈推薦這種用法,只是說明,有這樣一種方法存在。
本文推薦第二種方法,(2)用參數傳遞的方法,把同步對象傳遞給不同的類。
給你網站
http://www.webpc8.com/Article/java/xc/
『捌』 java經典書籍
你好,因為這個問題我以前答過了,所以就引用我以前的答案了。
一、Java編程入門類
對於沒有Java編程經驗的程序員要入門,隨便讀什麼入門書籍都一樣,這個階段需要你快速的掌握Java基礎語法和基本用法,宗旨就是「囫圇吞棗不求甚解」,先對Java熟悉起來再說。用很短的時間快速過一遍Java語法,連懵帶猜多寫寫代碼,要「知其然」。
1、《Java編程思想》
在有了一定的Java編程經驗之後,你需要「知其所以然」了。這個時候《Java編程思想》是一本讓你知其所以然的好書,它對於基本的面向對象知識有比較清楚的交待,對Java基本語法,基本類庫有比較清楚的講解,可以幫你打一個良好的Java編程基礎。這本書的缺點是實在太厚,也比較羅嗦,不適合現代人快節奏學習,因此看這本書要懂得取捨,不是每章每節都值得一看的,挑重點的深入看就可以了。
2、《Agile Java》中文版
這本書是出版社送給我的,我一拿到就束之高閣,放在書櫃一頁都沒有翻過,但是前兩天整理書櫃的時候,拿出來一翻,竟然發現這絕對是一本好書!這本書一大特點是以單元測試和TDD來貫穿全書的,在教你Java各種重要的基礎知識的過程中,潛移默化的影響你的編程思維走向敏捷,走向TDD。另外這本書成書很新,以JDK5.0的語法為基礎講解,要學習JDK5.0的新語法也不錯。還有這本書對於內容取捨也非常得當,Java語言畢竟類庫龐大,可以講的內容太多,這本書選擇的內容以及內容的多寡都很得當,可以讓你以最少的時間掌握Java最重要的知識,順便培養出來優秀的編程思路,真是一本不可多得的好書。
雖然作者自己把這本書定位在入門級別,但我不確定這本書用來入門是不是稍微深了點,我自己也准備有空的時候翻翻這本書,學習學習。
二、Java編程進階類
打下一個良好的Java基礎,還需要更多的實踐經驗積累,我想沒有什麼捷徑。有兩本書值得你在編程生涯的這個階段閱讀,培養良好的編程習慣,提高你的代碼質量。
1、《重構 改善既有代碼的設計》
這本書名氣很大,不用多介紹,可以在閑暇的時候多翻翻,多和自己的實踐相互印證。這本書對你產生影響是潛移默化的。
2、《測試驅動開發 by Example》
本書最大特點是很薄,看起來沒有什麼負擔。你可以找一個周末的下午,一邊看,一邊照做,一個下午就把書看完,這本書的所有例子跑完了。這本書的作用是通過實戰讓你培養TDD的思路。
三、Java架構師之路
到這個階段,你應該已經非常嫻熟的運用Java編程,而且有了一個良好的編程思路和習慣了,但是你可能還缺乏對應用軟體整體架構的把握,現在就是你邁向架構師的第一步。
1、《Expert One-on-One J2EE Design and Development》
這本書是Rod Johnson的成名著作,非常經典,從這本書中的代碼誕生了springframework。但是好像這本書沒有中譯本。
2、《Expert One-on-One J2EE Development without EJB》
這本書由gigix組織翻譯,多位業界專家參與,雖然署名譯者是JavaEye,其實JavaEye出力不多,實在是忝居譯者之名。
以上兩本書都是Rod Johnson的經典名著,Java架構師的必讀書籍。在我所推薦的這些書籍當中,是我看過的最仔細,最認真的書,我當時讀這本書幾乎是廢寢忘食的一氣讀完的,有小時候挑燈夜讀金庸武俠小說的勁頭,書中所講內容和自己的經驗知識一一印證,又被無比精闢的總結出來,讀完這本書以後,我有種被打通經脈,功力爆增的感覺。
但是後來我看過一些其他人的評價,似乎閱讀體驗並沒有我那麼high,也許是因為每個人的知識積累和經驗不同導致的。我那個時候剛好是經驗知識積累已經足夠豐富,但是還沒有系統的整理成型,讓這本書一梳理,立刻形成完整的知識體系了。
3、《企業應用架構模式》
Martin的又一本名著,但這本書我只是泛泛的看了一遍,並沒有仔細看。這本書似乎更適合做框架的人去看,例如如果你打算自己寫一個ORM的話,這本書是一定要看的。但是做應用的人,不看貌似也無所謂,但是如果有空,我還是推薦認真看看,會讓你知道框架為什麼要這樣設計,這樣你的層次可以晉升到框架設計者的角度去思考問題。Martin的書我向來都是推崇,但是從來都沒有像Rod Johnson的書那樣非常認真去看。
4、《敏捷軟體開發 原則、模式與實踐》
Uncle Bob的名著,敏捷的經典名著,這本書比較特別,與其說是講軟體開發過程的書,不如說講軟體架構的書,本書用了很大篇幅講各種面向對象軟體開發的各種模式,個人以為看了這本書,就不必看GoF的《設計模式》了。
四、軟體開發過程
了解軟體開發過程不單純是提高程序員個人的良好編程習慣,也是增強團隊協作的基礎。
1、《UML精粹》
UML其實和軟體開發過程沒有什麼必然聯系,卻是軟體團隊協作溝通,撰寫軟體文檔需要的工具。但是UML真正實用的圖不多,看看這本書已經足夠了,完全沒有必要去啃《UML用戶指南》之類的東西。要提醒大家的是,這本書的中譯本翻譯的非常之爛,建議有條件的看英文原版。
2、《解析極限編程 擁抱變化》XP
這是Kent Beck名著的第二版,中英文對照。沒什麼好說的,必讀書籍。
3、《統一軟體開發過程》UP
其實UP和敏捷並不一定沖突,UP也非常強調迭代,測試,但是UP強調的文檔和過程驅動卻是敏捷所不取的。不管怎麼說,UP值得你去讀,畢竟在中國真正接受敏捷的企業很少,你還是需要用UP來武裝一下自己的,哪怕是披著UP的XP。
4、《敏捷建模》AM
Scott Ambler的名著,這本書非常的progmatic,告訴你怎麼既敏捷又UP,把敏捷和UP統一起來了,又提出了很多progmatic的建議和做法。你可以把《解析極限編程 擁抱變化》、《統一軟體開發過程》和《敏捷建模》這三本書放在一起讀,看XP和UP的不同點,再看AM是怎麼統一XP和UP的,把這三種理論融為一爐,形成自己的理論體系,那麼你也可以去寫書了。
五、軟體項目管理
如果你突然被領導提拔為項目經理,而你完全沒有項目管理經驗,你肯定會心裡沒底;如果你覺得自己管理項目不善,很想改善你的項目管理能力,那麼去考PMP肯定是遠水不解近渴的。
1、《快速軟體開發》
這也是一本名著。可以這樣說,有本書在手,你就有了一個項目管理的高級參謀給你出謀劃策,再也不必擔心自己不能勝任的問題了。這本書不是講管理的理論的,在實際的項目管理中,講這些理論是不解決問題的,這本書有點類似於「軟體項目點子大全」之類的東西,列舉了種種軟體項目當中面臨的各種問題,以及應該如何解決問題的點子,你只需要稍加變通,找方抓葯就行了。
六、總結
在這份推薦閱讀書籍的名單中,我沒有列舉流行的軟體框架類學習書籍,例如Struts,Hibernate,Spring之類,也沒有列舉AJAX方面的書籍。是因為這類書籍容易過時,而上述的大半書籍的生命周期都足夠長,值得你去購買和收藏。
『玖』 《第一行代碼Java視頻講解版》pdf下載在線閱讀全文,求百度網盤雲資源
《第一行代碼Java視頻講解版》網路網盤pdf最新全集下載:
鏈接: https://pan..com/s/1enQdBOsxCJkKCPz2UE-CwQ
『拾』 推薦幾本javaEE的書籍,經典的。不要李剛的(雖然講的好,但是繁瑣,基礎東西太多了)。結合了三大框架的
[Spring.2.0核心技術和最佳實踐。廖學鋒掃描版。
容易的Hibernate「PDF清晰版。PDF
精通struts的基於MVC的設計與開發PDF
[Struts.2權威指南 - 基於MVC開發的WebWork的核心。鋼。Java.web掃描版PDF
Java方面的內部電驢學習知識
:
遞歸集合J2SE面向對象 - 封裝,繼承,多態
內存分析,通用,自動裝箱和拆箱,注釋
IO
多線程,線程同步
TCP / UDP
AWT,事件模型,匿名類
反射機制
SQL語句
多表聯接的資料庫(Oracle或MySQL)的正則表達式,內部和外部連接,子查詢
管理表,視圖,索引,序列,約束樹的存儲
存儲過程,觸發器
資料庫設計三大範式,
3:JDBC
JDBC基本/>連接池
樹的存儲和顯示
數據源的RowSet
JDBC連接Oracle和MySQL
:HTML_CSS_JAVASCRIPT
HTML,CSS,JavaScript的基本語法
> JavaScript的形成判斷
DOM編程基礎(事件處理程序)
JS效果,如TreeView,下拉聯動JS學習方法
JS調試方法
DreamWeaver的初步(創建HTML,表格,表單,CSS)
5:Servlet的基礎JSP
Tomcat的
servlet的基礎的
web.xml中的配置基本
Web應用程序結構
servlet的生命周期
請求的響應常用的方法
的ServletContext類
HTTP協議基礎(GET,POST)
餅干會話
應用程序
幾個語法(JSP,包括JSTL)注意練習的項目,而不是堅持的語法和包裝步驟的細節之前。
6:Struts的
多層體系結構的理論
模式1和模式2
Struts的
MVC
操作的業務邏輯類的基本概念之間的關系
Struts和JSP之間傳遞數據的
的Struts的治療過程(流量控制)
的Struts的TagLib(了解常用的)
JSTL
中的ActionForm
>欄位集合
上傳文件的類型轉換
DTO
動力作用形成的
驗證框架
的ActionForward轉發和重定向
動態生成的ActionForward
全局和局部的ActionForward
行動的推進范圍
UnknownActionMapping
行動線程安全
I18N
如何切換語言環境的
Struts的異常處理機制處理
用戶自定義的異常處理程序
Struts的多模塊配置7:XML
(XML / XSL,XSLT / DTD的,SCHEMA基本的Java編程的概念可以自動處理暫且不說)
8:休眠 OR映射
Hibernate的基本發展原則,步驟
休眠
基本介面(重點屆)
常見的屬性的映射關系映射
原生SQL
懶級聯反
繼承關系映射
HQL
性能優化緩存二級緩存查詢緩存
事務並發悲觀鎖定,樂觀鎖定
OpenSessionInView
CurrentSession
(至於JTA,的聯合主鍵的自然主鍵動態主鍵的任何類型Creteria查詢截擊和事件自定義類型,等等。 ,你可以暫時扔到一邊)
9:春季
IOC / DI
Spring配置
春季建築
AOP和Spring AOP
聲明式事務(AOP )
Spring + Hibernate的春天的Web
范圍
(其他的Spring模塊,你可以暫時扔到一邊自學)
10:EJB3.0
J2EE架構基金會(JTA JMS)
EJB基礎(地位及基本理論,分類等)
注釋
Ant的編譯和部署EJB
會話Bean的
EJB依賴注入
持久性API
(JBoss的學習EJB3.0)
11:SOA
30個進球
你需要精通面向對象分析與設計(OOA / OOD),涉及模式(GOF,J2EEDP),以及綜合模式。你應該充分了解UML,尤其是類,對象,互動,和statediagrams。<BR / 2,你需要學習JAVA語言以及它的核心類庫集合,序列化,流,網路,多線程,反射,事件處理,NIO,定製系統的本地化,以及其他的基本知識。
3類載入器,JVM,classreflect,以及垃圾回收的基本工作機制,您應該是知道的,你應該有能力反編譯一個類文件並且明白一些基本的匯編指令。
如果你要寫一個客戶端程序,你需要學習WEB的小應用程序(applet),必需掌握GUI設計的思想和方法的,和桌面應用程序的SWING,AWT,SWT,你也明白的UI部件的JAVABEAN組件模式中。JAVABEANS適用於業務邏輯的分離表示層JSP。
5。需要學習java資料庫技術,如JDBCAPI,會使用至少一種persistence / ORM構架,比如Hibernate,JDO,CocoBase,TopLink的InsideLiberator(國產JDO紅工廠軟體)或者iBatis。
6。您還應該了解對象關系的阻抗失配的含義,以及它是如何影響業務對象的與關系型資料庫交互,和結果它的操作,但還需要掌握不同的資料庫產品,如拉克勒,MySQL和MSSQLSERVER。
7。你需要學習JAVA的沙盒安全模式(類載入器,bytecodeverification,的經理,policyandpermissions,
代碼簽名,加密技術,認證,Kerberos身份,和其他人)digitalsignatures,以及不同的安全/認證API的JAAS()的,JCE(JavaCryptographyExtension)的的JSSE(JavaSecureSocketExtension)以及JGSS(JavaGeneralSecurityService)。
8。你需要學習Servlets和JSP,以及的JSTL(StandardTagLibraries)和選定的第三方TagLibraries。
9。你需要熟悉主流的網頁框架,例如JSF,Struts中,掛毯,蠶繭,WebWork中,和他們下面的涉及模式,如MVC/MODEL2。
10。你需要學習如何使用及管理WEB伺服器,例如tomcat的,樹脂的JRUN,並知道如何的基礎上擴展和維護WEB程序。
11。你需要學習分布式對象和遠程API,例如RMI和RMI / IIOP。
12。你需要掌握各種流行中間件技術標准,並結合java實現,比如Tuxedo,CROBA,當然也包括JavaEE的本身。你應該學會
你需要學習至少一個XMLAPI例如JAXP(JavaAPIforXMLProcessing)的JDOM(JavaforXMLDocumentObjectModel),DOM4J,或JAXR(JavaAPIforXMLRegistries)。
14。如何利用JAVAAPI和工具來構建WebService的。(JavaAPIforXML / RPC),JAX-RPC SAAJ的(SOAPwithAttachmentsAPIforJava)的,JAXB(JavaArchitectureforXMLBinding)JAXM(JavaAPIforXMLMessaging)的JAXR(JavaAPIforXMLRegistries),或JWSDP(JavaWebServicesDeveloperPack)的。
> 15。需要,學習一個輕量級應用程序框架,例如Spring中,PicoContainer的阿瓦隆,以及他們的IoC / DI風格(setter方法??,構造函數,集成*** ceinjection)。
16。你需要熟悉不同的J2EE技術??,例如JNDI(JavaNamingandDirectoryInte *** CE)的JMS(JavaMessageService)的,JTA / JTS(JavaTransactionAPI / JavaTransactionService)的JMX(JavaManagementeXtensions),以及JavaMail的。
17。企業類級JavaBeans(EJB),你需要學習以及它們的不同組件模式:無狀態/ StatefulSessionBeans,EntityBeans(bean-ManagedPersistence的包含[BMP]或容器ManagedPersistence [CMP]和它的EJB-QL),或者消息DrivenBeans(MDB )
18。你需要學習如何管理與配置一個J2EE應用程序伺服器,如WebLogic,JBoss的,並利用它的附加服務,例如簇類,連接池以及分布式處理的支持。您還需要了解它是如何封裝和配置應用程序能夠監控,調整它的性能。
19。你需要熟悉面向方面的編程,以及面向屬性的程序設計(兩個很容易混淆縮寫為AOP),以及他們的主流JAVA規格和執行。如AspectJ和AspectWerkz。
20。熟悉的服務不同有用的API和框架為你工作。例如,Log4J的(記錄/跟蹤),石英(調度)的JGroups(networkgroupcommunication)JCache(distributedcaching)的,Lucene的(全職文章搜索)JakartaCommons的。
21。如果你要對接和舊的系統或本地平台,你需要學習的JNI(JavaNativeInte *** CE)和JCA(JavaConnectorArchitecture)。
22。JINI技術,您需要熟悉,和它的分布式系統,如主CROBA。
23。你需要JavaCommunityProcess的( JCP),和他的不同JavaSpecificationRequests(JSR的),如JOLAP的Portlets(168)(69)(73),DataMiningAPI,等等。
24。你應該熟悉與的一個JAVAIDE例子的SunOne的NetBeans IntelliJIDEA或Eclipse(有些人更喜歡VI或EMACS來編寫文件不管你是什麼:)
25.JAVA一些配置(精確)是冗長的,它需要很多的人工代碼(例如EJB),所以你需要熟悉代碼生成工具,例如XDoclet。
26。你需要熟悉單元測試體系(JNunit),並且學習不同的生成,部署工具(Ant,Maven的)。
27。你需要熟悉JAVA開發的,經常使用的軟體工程過程。例如RUP(RationalUnifiedProcess)andAgilemethodologies的。
28。你需要深入了解加熟練操作和配置操作系統,比如GNU / Linux操作系統,sunsolaris MacOS的,作為一個跨平台的軟體開發。
29。您還需要跟上Java的發展步伐,比如現在可以深入學習javaME的,以及各種java中,使用的技術,如啟動一個新的web富客戶端技術的新規范。
30。您需要了解開源,至少在,許多Java技術的直接依賴開放源碼,以推動發展,如JAVA3D技術。