⑴ android synchronized 與性能相關嗎
這個synchronized其實是一個線程鎖,在保持數據同步上起到很到作用。你現在的狀況 我猜你只要記住就行了 你暫時不用接觸這些 下面是關於synchronized的一些理解吧! 一、當兩個並發線程訪問同一個對象object中的這個synchronized(this)同步代碼塊時,一個時間內只能有一個線程得到執行。另一個線程必須等待當前線程執行完這個代碼塊以後才能執行該代碼塊。 二、當一個線程訪問object的一個synchronized(this)同步代碼塊時,其他線程對object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。 三、然而,當一個線程訪問object的一個synchronized(this)同步代碼塊時,另一個線程仍然可以訪問該object中的除synchronized(this)同步代碼塊以外的部分。 四、第三個例子同樣適用其它同步代碼塊。也就是說,當一個線程訪問object的一個synchronized(this)同步代碼塊時,它就獲得了這個object的對象鎖。結果,其它線程對該object對象所有同步代碼部分的訪問都被暫時阻塞。 五、以上規則對其它對象鎖同樣適用 ========================i值的傳輸=============== 解析main函數的代碼塊 TT t1 = new TT(); Thread tt = new Thread(t1); tt.start(); t1.m2(); System.out.println("t1.i = "+t1.i); TT t1 = new TT();//很簡單 初始化這個TT類。但這個TT是繼承了Runnable介面的類。並且實現了Runnable的run方法。 Thread tt = new Thread(t1);//實例化一個線程實例。並將TT類的句柄傳給這個線程。 tt.start();//啟動線程,這個就是啟動tt類中的run方法。但和直接運行run方法不一樣。記住這點。start()代表這個線程啟動了。就開始運行線程里的方法 public void run(){ m1(); } 這個 然後這個方法去調用m1()方法。********* ================= int i = 100; public synchronized void m1(){ try{ i=200; Thread.sleep(5000); System.out.println("m1:i = "+i); }catch(InterruptedException ie){ ie.printStackTrace(); } 雖然int i = 100;但try裡面給i賦值了。現在的i =200; Thread.sleep(5000);線程睡了5秒的覺 System.out.println("m1:i = "+i);//然後列印了i的值 。這個i等於200;所以列印出200; ============================= 再看 t1.m2();他是通過TT句柄方法m2()方法。這個你應該理解吧! 運行m2()方法 ============================ public synchronized void m2() throws Exception{ i=300; Thread.sleep(2000); System.out.println("m2:i = "+i); } i=300;給i賦值,所以i等於300 Thread.sleep(2000);線程睡了2秒覺。 System.out.println("m2:i = "+i);醒來後列印了個300 =========================== 最後一句System.out.println("t1.i = "+t1.i); 這個地方就看t1.i(加好後面的,前面只是字元串),這個就是直接調用TT里的變數i 這個時候的i被修改了編程300了 所以是300.
⑵ 學習Android要懂什麼技術
入門的話有以上知識儲備就夠了,如果要深的話,最好把java編程思想,java並發編程實戰,深入理解jvm這幾本書搞定,消化。最重要的是多練,不然一切都是白費。可以一邊學一邊做個小項目,這樣成長會比較快一些
——————————————————————
補充:如果想去一些好的互聯網公司的話,比如阿里,個人感覺手裡有幾個靠譜的項目,然後上面那幾本書中的東西都能搞定,應該沒有問題
⑶ android學習的問題(java相關)
html與xml是數據的表現形式,在網路上一般以http協議或tcp協議傳輸,所以「熟悉HTML/XML/HTTP」說白了就是要知道http協議。通信介面就是獲取這些數據的服務端,這類似於網址,但他們返回的內容是使用xml或json表現的數據而非傳統的html,所以你要會服務端編程,即servlet或其他j2ee技術;另外你還需要知道如何對數據進行封閉和解析。對於通信協議你可以看看<java網路編程》, 服務端的話一般大學學java的都會學到。多線程的話可以看看《java並發編程實戰》。
⑷ android多核,多線程該如何用
在程序開發的實踐當中,為了讓程序表現得更加流暢,我們肯定會需要使用到多線程來提升程序的並發執行性能。但是編寫多線程並發的代碼一直以來都是一個相對棘手的問題,所以想要獲得更佳的程序性能,我們非常有必要掌握多線程並發編程的基礎技能。
眾所周知,Android 程序的大多數代碼操作都必須執行在主線程,例如系統事件(例如設備屏幕發生旋轉),輸入事件(例如用戶點擊滑動等),程序回調服務,UI 繪制以及鬧鍾事件等等。那麼我們在上述事件或者方法中插入的代碼也將執行在主線程。
一旦我們在主線程裡面添加了操作復雜的代碼,這些代碼就很可能阻礙主線程去響應點擊/滑動事件,阻礙主線程的 UI 繪制等等。我們知道,為了讓屏幕的刷新幀率達到 60fps,我們需要確保 16ms 內完成單次刷新的操作。一旦我們在主線程裡面執行的任務過於繁重就可能導致接收到刷新信號的時候因為資源被佔用而無法完成這次刷新操作,這樣就會產生掉幀的現象,刷新幀率自然也就跟著下降了(一旦刷新幀率降到 20fps 左右,用戶就可以明顯感知到卡頓不流暢了)。
為了避免上面提到的掉幀問題,我們需要使用多線程的技術方案,把那些操作復雜的任務移動到其他線程當中執行,這樣就不容易阻塞主線程的操作,也就減小了出現掉幀的可能性。
那麼問題來了,為主線程減輕負的多線程方案有哪些呢?這些方案分別適合在什麼場景下使用?Android 系統為我們提供了若干組工具類來幫助解決這個問題。
AsyncTask: 為 UI 線程與工作線程之間進行快速的切換提供一種簡單便捷的機制。適用於當下立即需要啟動,但是非同步執行的生命周期短暫的使用場景。
HandlerThread: 為某些回調方法或者等待某些任務的執行設置一個專屬的線程,並提供線程任務的調度機制。
ThreadPool: 把任務分解成不同的單元,分發到各個不同的線程上,進行同時並發處理。
IntentService: 適合於執行由 UI 觸發的後台 Service 任務,並可以把後台任務執行的情況通過一定的機制反饋給 UI。
了解這些系統提供的多線程工具類分別適合在什麼場景下,可以幫助我們選擇合適的解決方案,避免出現不可預期的麻煩。雖然使用多線程可以提高程序的並發量,但是我們需要特別注意因為引入多線程而可能伴隨而來的內存問題。舉個例子,在 Activity 內部定義的一個 AsyncTask,它屬於一個內部類,該類本身和外面的 Activity 是有引用關系的,如果 Activity 要銷毀的時候,AsyncTask 還仍然在運行,這會導致 Activity 沒有辦法完全釋放,從而引發內存泄漏。所以說,多線程是提升程序性能的有效手段之一,但是使用多線程卻需要十分謹慎小心,如果不了解背後的執行機制以及使用的注意事項,很可能引起嚴重的問題。
⑸ 接觸Android網路編程需要什麼知識基礎
Android平台的網路應用絕大部分都是基於Java的編程介面的,也就是說我們開發類似的運用的時候可以有多種選擇,比J2me確實好多了。
2.1. 標准Java介面
java.net.*下面提供了訪問 HTTP 服務的基本功能。使用這部分介面的基本操作主要包括:
·創建 URL 以及 URLConnection / HttpURLConnection 對象
· 設置連接參數
·連接到伺服器
· 向伺服器寫數據
·從伺服器讀取數據
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.HttpURLConnection;
try {
// 創建一個 URL 對象
URL url = new URL(your_url);
// 創建一個 URL 連接,如果有代理的話可以指定一個代理。
URLConnection connection = url.openConnection(Proxy_yours);
// 對於 HTTP 連接可以直接轉換成 HttpURLConnection,
// 這樣就可以使用一些 HTTP 連接特定的方法,如 setRequestMethod() 等
//HttpURLConnection connection =
(HttpURLConnection)url.openConnection(Proxy_yours);
// 在開始和伺服器連接之前,可能需要設置一些網路參數
connection.setConnectTimeout(10000);
connection.addRequestProperty("User-Agent",
"J2me/MIDP2.0");
// 連接到伺服器
connection.connect();
// 往伺服器寫數據,數據會暫時被放到內存緩存區中
// 如果僅是一個簡單的 HTTP GET,這一部分則可以省略
OutputStream outStream = connection.getOutputStream();
ObjectOutputStream objOutput = new ObjectOutputStream(outStream);
objOutput.writeObject(new String("this is a string..."));
objOutput.flush();
// 向伺服器發送數據並獲取應答
InputStream in = connection.getInputStream();
// 處理數據
...
} catch (Exception e) {
// 網路讀寫操作往往會產生一些異常,所以在具體編寫網路應用時
// 最好捕捉每一個具體以採取相應措施
}
2.2. Apache介面
Apache HttpClient 是一個開源項目,彌補了 java.net.* 靈活性不足的缺點,為客戶端的HTTP編程提供高效、最新、功能豐富的工具包支持。Android 平台引入了 Apache HttpClient 的同時還提供了對它的一些封裝和擴展,例如設置預設的HTTP超時和緩存大小等。早期的 Android 曾同時包括 Commons HttpClient (org.apache.commons.httpclient.*) 和 HttpComponents (org.apache.http.client.* ),不過當前版本 (1.5) 中開發者只能使用後者,也就是說類似以下的一些類:
使用這部分介面的基本操作與 java.net.* 基本類似,主要包括:
· 創建 HttpClient 以及 GetMethod / PostMethod, HttpRequest 等對象
·設置連接參數
·執行 HTTP 操作
· 處理伺服器返回結果
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.params. HttpConnectionParams;
import org.apache.http.client.params. HttpClientParams;
try {
// 創建 HttpParams 以用來設置 HTTP 參數(這一部分不是必需的)
HttpParams params = new BasicHttpParams();
// 設置連接超時和 Socket 超時,以及 Socket 緩存大小
HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);
HttpConnectionParams.setSoTimeout(params, 20 * 1000);
HttpConnectionParams.setSocketBufferSize(params, 8192);
// 設置重定向,預設為 true
HttpClientParams.setRedirecting(params, true);
// 設置 user agent
HttpProtocolParams.setUserAgent(params, userAgent);
// 創建一個 HttpClient 實例
// 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient
// 中的用法,在 Android 1.5 中我們需要使用 Apache 的預設實現 DefaultHttpClient
HttpClient httpClient = new DefaultHttpClient(params);
// 創建 HttpGet 方法,該方法會自動處理 URL 地址的重定向
HttpGet httpGet = new HttpGet ("http://www.test_test.com/");
HttpResponse response = client.execute(httpGet);
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
// 錯誤處理,例如可以在該請求正常結束前將其中斷
httpGet.abort();
}
// 讀取更多信息
Header[] headers = response.getHeaders();
HttpEntity entity = response.getEntity();
Header header = response.getFirstHeader("Content-Type");
} catch (Exception ee) {
//
} finally {
// 釋放連接
client.getConnectionManager().shutdown();
}
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.params. HttpConnectionParams;
import org.apache.http.client.params. HttpClientParams;
try {
// 創建 HttpParams 以用來設置 HTTP 參數(這一部分不是必需的)
HttpParams params = new BasicHttpParams();
// 設置連接超時和 Socket 超時,以及 Socket 緩存大小
HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);
HttpConnectionParams.setSoTimeout(params, 20 * 1000);
HttpConnectionParams.setSocketBufferSize(params, 8192);
// 設置重定向,預設為 true
HttpClientParams.setRedirecting(params, true);
// 設置 user agent
HttpProtocolParams.setUserAgent(params, userAgent);
// 創建一個 HttpClient 實例
// 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient
// 中的用法,在 Android 1.5 中我們需要使用 Apache 的預設實現 DefaultHttpClient
HttpClient httpClient = new DefaultHttpClient(params);
// 創建 HttpGet 方法,該方法會自動處理 URL 地址的重定向
HttpGet httpGet = new HttpGet ("http://www.test_test.com/");
HttpResponse response = client.execute(httpGet);
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
// 錯誤處理,例如可以在該請求正常結束前將其中斷
httpGet.abort();
}
// 讀取更多信息
Header[] headers = response.getHeaders();
HttpEntity entity = response.getEntity();
Header header = response.getFirstHeader("Content-Type");
} catch (Exception ee) {
//
} finally {
// 釋放連接
client.getConnectionManager().shutdown();
}
以下例子以 HttpGet 方式通過代理訪問 HTTPS 網站:
try {
HttpClient httpClient = new HttpClient();
// 設置認證的數據
httpClient.getCredentialsProvider().setCredentials(
new AuthScope("your_auth_host", 80, "your_realm"),
new UsernamePasswordCredentials("username", "password"));
// 設置伺服器地址,埠,訪問協議
HttpHost targetHost = new HttpHost("www.test_test.com", 443, "https");
// 設置代理
HttpHost proxy = new HttpHost("192.168.1.1", 80);
httpClient.getParams().setParameter
(ConnRoutePNames.DEFAULT_PROXY, proxy);
// 創建一個 HttpGet 實例
HttpGet httpGet = new HttpGet("/a/b/c");
// 連接伺服器並獲取應答數據
HttpResponse response = httpClient.execute(targetHost, httpGet);
// 讀取應答數據
int statusCode = response.getStatusLine().getStatusCode();
Header[] headers = response.getHeaders();
HttpEntity entity = response.getEntity();
} catch (Exception ee) {
//
2.3. Android介面
android.net.* 實際上是通過對 Apache 的 HttpClient 的封裝來實現的一個 HTTP 編程介面,同時還提供了 HTTP 請求隊列管理, 以及 HTTP 連接池管理,以提高並發請求情況下(如轉載網頁時)的處理效率,除此之外還有網路狀態監視等介面。
以下是一個通過 AndroidHttpClient 訪問伺服器的最簡例子:
import import android.net.http.AndroidHttpClient;
try {
AndroidHttpClient client = AndroidHttpClient.newInstance(「your_user_agent」);
// 創建 HttpGet 方法,該方法會自動處理 URL 地址的重定向
HttpGet httpGet = new HttpGet ("http://www.test_test.com/");
HttpResponse response = client.execute(httpGet);
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
// 錯誤處理
}
// 關閉連接
client.close();
} catch (Exception ee) {
//
}
⑹ android 開4個線程 速度會提升4倍嗎
對於Android平台上的線程優先順序設置來說可以處理很多並發線程的阻塞問題,比如很多無關緊要的線程會佔用大量的CPU時間,雖然通過了MultiThread來解決慢速I/O但是合理分配優先順序對於並發編程來說十分重要。Android在線程方面主要使用的是Java本身的Thread類,我們可以在Thread或Runnable介面中的run方法首句加入 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //設置線程優先順序為後台,這樣當多個線程並發後很多無關緊要的線程分配的CPU時間將會減少,有利於主線程的處理,相關的Thread優先順序定義羅列有以下幾種: int THREAD_PRIORITY_AUDIO //標准音樂播放使用的線程優先順序 int THREAD_PRIORITY_BACKGROUND //標准後台程序 int THREAD_PRIORITY_DEFAULT // 默認應用的優先順序 int THREAD_PRIORITY_DISPLAY //標准顯示系統優先順序,主要是改善UI的刷新 int THREAD_PRIORITY_FOREGROUND //標准前台線程優先順序 int THREAD_PRIORITY_LESS_FAVORABLE //低於favorable int THREAD_PRIORITY_LOWEST //有效的線程最低的優先順序 int THREAD_PRIORITY_MORE_FAVORABLE //高於favorable int THREAD_PRIORITY_URGENT_AUDIO //標准較重要音頻播放優先順序 int THREAD_PRIORITY_URGENT_DISPLAY //標准較重要顯示優先順序,對於輸入事件同樣適用。
⑺ Android新手有哪些資料比較好
必須的java基礎的
一、java
(a)基本語法(如繼承、異常、引用、泛型等)
Java核心技術 卷I(適合入門)
進階
Effective Java中文版(如何寫好的Java代碼)
Java解惑 (介紹爛Java代碼是什麼樣的)
(b)多線程、並發
Java並發編程實戰 (系統全面的介紹了Java的並發,如何設計支持並發的數據結構)
(c)Java 7
Java程序員修煉之道 (詳細的介紹Java 7 的新特性)
(d)Java 8
寫給大忙人看的Java SE 8
函數式編程思維
(e)Java虛擬機
深入理解Java虛擬機 (並不是那麼難,Java程序員都該看看)
(f)性能優化
Java性能優化權威指南 (後面的章節好像用處不大,前面有些部分還是值得看)
二、演算法與數據結構
演算法時間復雜度、空間復雜度的基本認知
熟悉常用數據結構:鏈表、隊列、散列表、樹等;
遞歸、分支等基本思想;
常用演算法應用:排序、查找、比較等
數據結構與演算法分析 (涵蓋面比較全、示例是Java語言)
演算法設計與分析基礎 (實用主義的典型、偏演算法設計)
編程珠璣 (實踐型演算法數據)
三、操作系統
對linux/OS的基本認知
Linux的常用命令
鳥哥的Linux私房菜
Linux內核設計與實現(原書第3版) (很精煉的語言描述清楚了內核演算法)
四、網路
Http/Https
TCP/IP
圖解HTTP
圖解TCP/IP
進階
TCP/IP詳解
五、Android
四大組件(服務、廣播、ContentProvider、頁面容器)
基礎UI組件(ListView、ViewPager)
非同步任務機制(AsyncTask、Handler、線程池)
布局優化(層級、繪制、碎片化處理)
圖片載入(Bitmap、緩沖區)
UniversalMusicePlayer (通過學習一個音樂播放器的代碼能很快了解四大組件)
Android Training官方課程
Android一些重要知識點解析整理
Android UI/UX庫(各類常用組件及擴展組件的集合)
Picasso 、 Glide (兩個圖片載入庫)
The Google I/O 2015 Android App (Google大會官方的App,適合學習各類實現)
Android開發技術前線 (定期翻譯、發布國內外Android優質的技術、開源庫、軟體架構設計、測試等文章)
進階
第三方庫集合 (列舉了常見的各方向第三方庫)
⑻ 以後希望從事android方向,java多線程重要嗎
Java多線程面試問題
1.進程和線程之間有什麼不同?
一個進程是一個獨立(self contained)的運行環境,它可以被看作一個程序或者一個應用。而線程是在進程中執行的一個任務。Java運行環境是一個包含了不同的類和程序的單一進程。線程可以被稱為輕量級進程。線程需要較少的資源來創建和駐留在進程中,並且可以共享進程中的資源。
2. 多線程編程的好處是什麼?
在多線程程序中,多個線程被並發的執行以提高程序的效率,CPU不會因為某個線程需要等待資源而進入空閑狀態。多個線程共享堆內存(heap memory),因此創建多個線程去執行一些任務會比創建多個進程更好。舉個例子,Servlets比CGI更好,是因為Servlets支持多線程而CGI不支持。
3. 用戶線程和守護線程有什麼區別?
當我們在Java程序中創建一個線程,它就被稱為用戶線程。一個守護線程是在後台執行並且不會阻止JVM終止的線程。當沒有用戶線程在運行的時候,JVM關閉程序並且退出。一個守護線程創建的子線程依然是守護線程。
4. 我們如何創建一個線程?
⑼ 隨筆之如何判斷Android應用進程是否為單線程及閑扯多核並行編程
我最早接觸多核知識是2008年末到2009年初。背景很簡單,我是做高性能網路數據傳輸伺服器的,類似FTPServer一樣。伺服器的吞吐能力最好是隨著CPU核數的增加成倍增長.。根據多核並行的知識,這是最理想的情況(有一個公式,可以計算性能和CPU核數的關系),但應用內部各個線程並非完全獨立。即線程是獨立運行在不同CPU核上,但是線程中所乾的事情卻在邏輯上有關系。例如運行在線程A上的函數等待運行在線程B上另外一個函數的執行結果。這樣就導致性能不是隨CPU核數線性增長。
根據上面的介紹,對於多核並行編程來說,最最重要的事情就是將你的應用中那些混淆不清的邏輯關系能拆成互不幹擾或者互相牽連較少的模塊,並讓他們在不同線程上運行。這樣就真正發揮多核的優勢了。
1 對於純邏輯關系的問題,也就是非計算方面(即矩陣計算,編解碼等),要想能掰叱清楚。難度很大。七大姑,八大姨的,能分那麼清楚嗎?目前,這方面的資料較少。
2 對於純計算方面的問題,例如矩陣計算,要研究的就不是編碼,而是數學,要把計算拆成各個小塊,每個小塊可單獨運行在獨立線程上,然後再匯總計算結果。這方面資料較多,如周偉明的《多核計算與程序設計》。編程角度看,OpenMP是一個多核並行計算的好庫。(有人能嘗試下用OpenMP來拆分邏輯工作嗎?)
好了。多核的故事閑扯到這,對於純邏輯關系問題,再扯的話就會扯到線程池,並發編程,非同步IO,驚群效應,分布式內存管理等等等等。
下面來看如何判斷Android應用進程為單線程還是多線程?請先思考,再看下面的答案:1android應用是運行在android環境中的,簡單來說,是運行在dalvik虛擬機之上,而dalvik虛擬機本身是會創建一些線程,例如垃圾回收線程,JDWP調試線程2Android應用會經常利用binder和系統服務進行IPC通信,根據binder本身的特性,它會動態創建線程來完成外界請求。
以上兩類線程都是應用不可控的,保守估計,這類不可控線程至少在3個左右3除了主線程之外的,就是應用自己是否會創建線程了。
查看一個進程中線程的方法有:
ps,加一些參數(具體忘記了),可看某個進程下的線程及線程號,但無法區別是系統創建的線程還是應用自己創建的線程
kill -3 對應進程pid,這個方法會向進程發送SIGQUIT消息,dalvik虛擬機會跟蹤這個信號,並列印該進程所有線程的堆棧到一個文件
native代碼(如Jni庫)如果直接調用posix創建線程,則上述方法無法跟蹤(如果該線程能回調到Java層,也可以獲取信息),只能根據ps得到的信息,減去SIGQUIT得到的信息來判斷了。不過這類線程一般都是應用自己創建的。
⑽ java並發編程從入門到精通怎麼樣
還是不錯的
目錄
第一部分:線程並發基礎
第1章概念部分 1
1.1CPU核心數、線程數(主流cpu,線程數的大體情況說一下) 1
1.2CPU時間片輪轉機制2
1.3什麼是進程和什麼是線程4
1.4進程和線程的比較5
1.5什麼是並行運行 7
1.6什麼是多並發運行 8
1.7什麼是吞吐量 9
1.8 多並發編程的意義及其好處和注意事項 10
1.9 分布式與並發運算關系 11
1.10Linux和Window多並發可以採取不的一樣機制(apache和tomcat??) 6
第2章認識Java裡面的Thread 12
2.1線程的實現三種方法 (先感受一下創建幾個多線程方法實例演練)12
2.2Thread裡面的屬性和方法(通過工具看看能不能監控到thread裡面的一些屬性值)16
2.3線程的生命周期19
2.4什麼是守護線程31
2.5線程組33
2.6當前線程副本ThreadLocal(用意和實際應用場景) 35
2.7線程異常的處理(單個和組)38
第3章 Thread安全 39
3.0 線程的內存模型
3.1 什麼是不安全(寫個代碼例子多並發帶來的一些問題,變數互串,相互影響) 39
3.2 什麼是安全(寫個代碼例子,安全的三種(多實例,加鎖,線程安全的集合類)情況,引出鎖) 43
3.3第一種鎖:隱式鎖,又稱線程同步synchronized(舉幾個例子實際演示一下,及其寫法注意,帶來的額外開銷)45
3.4第二種鎖:顯示鎖,Lock;及其與synchronized的區別(ReentrantReadWriteLock)49
3.5 什麼是死鎖 53
3.6看如下代碼的鎖有用嗎 55
3.7關鍵字:volatile 57
3.8原子操作:atomic(atomic包FutureTask, AtomicLong等) 59
3.9 線程同步和鎖的原理(有待弄清楚鎖的運行機制和原理) 61
3.10 單利模式的寫法 63
第4章 線程安全的集合類 64
4.1 java.util.concurrent. ConcurrentMap 64
4.2 java.util.concurrent.ConcurrentHashMap 66
4.3 java.util.concurrent. CopyOnWriteArrayList 68
4.4 java.util.concurrent. CopyOnWriteArraySet 70
4.5 非concurrent下面的線程安全集合類(Hashtable 和 Vector 和StringBuffer) 72
4.6 集合類安全的實現原理剖析 75
第二部分:線程並發晉級之高級部分 75
第5章 多線程之間交互:線程閥
(一句話解釋什麼叫閥門,最好都能講到實際使用的例子)75
5.1 線程安全的阻塞隊列BlockingQueue (詳解一翻java.util.concurrent.ConcurrentLinkedDeque 和java.util.concurrent. ConcurrentLinkedQueue) 76
5.2 同步計數器CountDownLatch 81
5.3循環障礙CyclicBarrier 84
5.4信號裝置Semaphore87
5.5任務機制FutureTask 90
第6章 線程池 115
6.1 什麼是線程池 90
6.2 newFixedThreadPool的使用 92
6.3newCachedThreadPool 的使用 94
6.4newSingleThreadExecutor的使用(插圖,原理)96
6.5線程池的好處(未使用的時候的情況,使用後的情況) 98
6.4認識ExecutorService(ThreadFactory先創建一個線程及其參數的詳細講解,如何自定義線程池)100
6.5線程池的原理 106
6.6 線程池在工作中的錯誤使用 112
第7章 JDK7新增的Fork/Join 115
7.1 什麼是Fork/Join 架構 115
7.2 創建實際使用Fork/Join 線程池118
7.3合並任務的結果 123
7.4工作原理126
7.5非同步運行任務 130
7.6在任務中拋出異常135
7.7結束任務 140
7.8 實際應用場景 143
第三部分:實際的使用與監控與拓展
第8章 線程,線程池在Servlet中 150
第9章 Tomcat中線程池如何設置 180
第10章 線程的監控及其日常工作中如何分析 210
linux分析監控方法
java的bin下面監控工具的使用
第11章 線程在Android開發中的體現 250
android的線程講解