Time of Update: 2018-12-06
前幾天做項目時,在做系統日誌這一塊,都是在每個方法裏手寫代碼來添加,覺得很繁瑣,考慮到spring有aop的功能,便尋思著用AOP來做這個日誌功能。首先需要傳入日誌記錄的具體操作名稱,我們可以用java的註解功能來帶入參數,代碼如下:/** * 類的方法描述註解 * @author LuoYu */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public
Time of Update: 2018-12-06
程式是很簡易的。然而,在編程人員面前,多線程呈現出了一組新的難題,如果沒有被恰當的解決,將導致意外的行為以及細微的、難以發現的錯誤。
Time of Update: 2018-12-06
java多線程設計wait、notify、notifyall、synchronized的使用機制 wait、notify、notifyall、synchronized的使用機制: synchronized(obj) { while(!condition) { obj.wait(); } obj.doSomething();} 當線程A獲得了obj鎖後,發現條件condition不滿足,無法繼續下一處理,於是線程A就wait() ,
Time of Update: 2018-12-06
JAVA中synchronized關鍵字能夠作為函數的修飾符,也可作為函數內的語句,也就是平時說的同步方法和同步語句塊。搞清楚synchronized鎖定的是哪個對象,就能協助我們設計更安全的多線程程式。 不久前用到了同步,現在回過頭來對JAVA中的同步做個總結,以對前段時間工作的總結和自我技術的條理話。JAVA的synchronized關鍵字能夠作為函數的修飾符,也可作為函數內的語句,也就是平時說的同步方法和同步語句塊。假如再細的分類,synchronized可作用於instance變數
Time of Update: 2018-12-06
1. Interface 可以用來持有任何implementation該Interface的對象,這和父類可以持有子類是一樣的。2. 任何需要一個類A的方法,你都可以把A的子類作為A的替代品來使用,當然有關具體的方法覆蓋引起的問題,你要自己care3. 一旦強制轉換成功了,你就可以使用任意的屬於轉換後對象的方法,舉例來說: > A a = (A)b //把b執行個體轉換成A對象的執行個體 > a.methodOfA() //
Time of Update: 2018-12-06
由於在項目中的一些教訓,最近回顧了一下多線程,寫了下面這樣一個簡單的執行個體。多線程的重點應當在於,線程的互動和鎖,鎖用來保護資料的原子性,線程的互動用於更靈活的線程通訊。 測試線程的互動性,線程間互動實現以下細節:* 生產者—消費—倉庫 模型* 測試線程的互動性* 主要實現:* 第一:生產者 生產的消費品 存放到倉庫中,當倉庫滿時,生產者停止生產* 第二:消費者 到倉庫中 使用消費品,當倉庫沒有消費品時,停止消費* 第三:生產者 在倉庫滿停止生產後 通知消費者去消費* 第四:消費者
Time of Update: 2018-12-06
線程的監視器,即線程所持有的鎖,也就是synchronized所關聯的對象。線程的互斥,即同一資料的訪問,為了訪問資料的同步,維護資料的原子性。線程的互斥 由線程的監視器機制來實現。下面舉例幾種監視器: 1.範圍成員變數: class ViewData { private Object lock=new Object(); public void viewData(String
Time of Update: 2018-12-06
一下樣本為 java api並發庫中 ReentrantReadWriteLock內建的執行個體,下面進行解讀 class CachedData { Object data; volatile boolean cacheValid; ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); void processCachedData() { rwl.readLock().lock();//@1 if (
Time of Update: 2018-12-06
jvm多個線程間的通訊是通過 線程的鎖、條件陳述式、以及wait()、notify()/notifyAll組成。下面來實現一個啟用多個線程來迴圈的輸出兩個不同的語句。package com.app.thread;import javax.swing.plaf.SliderUI;/** * 看出問題來 * @author Gordon * */public class LockDemo { public static void main(String[] args)
Time of Update: 2018-12-06
1.修改Launcher原始碼 2.進行模組編譯 mmm packages/apps/Launcher 注意路徑,我是在home/wuyutaott/android下進行的 如果提示沒有找到mmm命令 執行. build/envsetup.sh 3.編譯過之後 /home/wuyutaott/android/out/target/product/generic/system/app/Launcher.apk這個檔案會更新
Time of Update: 2018-12-06
首先,看一張類集架構的關係圖,這張圖詳細的描述了類集架構中的類以及介面。從關係圖中可以看到,我們一般使用都都是從Collection介面繼承過來的。下面我們看看Collection都有哪些方法供我們使用。類集架構主體結構:集合(set):對象不按特定的當時排序,沒有重複對象。列表(list):對象按照索引位置排序,可以有重複的對象。映射(map):每一個元素包含一個鍵對象和一個值對象,鍵不可以重複,值可以重複。執行個體一,List:import
Time of Update: 2018-12-06
Java 的 Class Path 和 Package(1)作者:未知 文章來源:http://www.jspcn.net/訪問次數: 次 加入時間:2005-01-19一, 類路徑 (class path) 當你滿懷著希望安裝好了 java, 然後興沖沖地寫了個 hello world,然後編譯, 運行, 就等著那兩個美好的單詞出現在眼前, 可是不幸的是, 只看到了 Can´t find class HelloWorld 或者 Exception in thread "main"
Time of Update: 2018-12-06
這幾天沒來寫日誌,因為正在作學習Java前的準備。主要是在網上搜一些文章,包括關於Java的、關於Eclipse 以及
Time of Update: 2018-12-06
Java 的 Class Path 和 Package(2)作者:未知 文章來源:http://www.jspcn.net/訪問次數: 次 加入時間:2005-01-19二, 包 (package) Java 中的 "包" 是一個比較重要的概念, package 是這樣定義的: Definition: A package is a collection of related classes and interfaces that provides access
Time of Update: 2018-12-06
由於要在同一個ubuntu環境下編譯2.1和2.3兩份代碼,而他們所使用的java版本一個是1.5,一個是1.6,所以在編之前需要進行切換;切換的方法很簡單,使用下面的兩個命令即可: update-alternatives --config java update-alternatives --config javac例如:root@desktop-ubuntu:~# update-alternatives --config javaThere are 2 choices for the
Time of Update: 2018-12-06
*所謂同步機制是指兩個線程同時操作一個對象,應該保持對象資料的統一性和整體性。*Java語言中有兩種同步形式,即同步方法和同步代碼塊。1,同步方法同步方法將訪問這個資源的方法都標記為synchronized,這樣在需要調用這個方法的線程執行完之前,其它調用該方法的線程都會被阻塞。synchronized void sum(){…}synchronized void max(){…}*建立兩個線程的例子import java.util.logging.Level; import
Time of Update: 2018-12-06
*類的聲明 [修飾符] class <類名> [extends 父類名] [implements 介面列表]{ } 修飾符:可選,用於指定存取權限,可用值為public,abstract和finnal. 類名:一般情況下,要求首字母要大寫。 extends 父類名:可選,用於指定要定義的類繼承於哪個父類。 implements
Time of Update: 2018-12-06
*構造方法是一種特殊的方法,它的名字必須和類名完全相同,沒有傳回值,也不需要使用關鍵字void進行標識。*構造方法用於對對象中所有成員變數進行初始化,在建立對象時立即被調用。*需要注意到是,如果使用者沒有定義構造方法,系統會提供一個預設的構造方法,用來實現成員變數的初始化。*構造方法支援重載*Java語言各種類型變數的初值 byte 0 short 0 int 0 float 0.0f long 0L double 0.0D char '\u000' boolean
Time of Update: 2018-12-06
一般造成死結必須同時滿足如下4個條件: 1,互斥條件:線程使用的資源必須至少有一個是不能共用的; 2,請求與保持條件:至少有一個線程必須持有一個資源並且正在等待擷取一個當前被其它線程持有的資源; 3,非剝奪條件:分配資源不能從相應的線程中被強制剝奪; 4,迴圈等待條件:第一個線程等待其它線程,後者又在等待第一個線程。因為要產生死結,這4個條件必須同時滿足,所以要防止死結的話,只需要破壞其中一個條件即可。
Time of Update: 2018-12-06
*Java多線程基本上靠Thread類和Runnable介面來實現*Thread類的方法*構造方法Thread();Thread(Runnable runnable);//和介面一起使用,主要是協助介面實現start()方法,因為Runnable介面沒有start方法Thread(String name);//線程名稱Thread(Runnable runnable , String