編輯:關於Android編程
在Java的util.concurrent.locks包下有關於鎖的接口和類如下:
先看一段代碼:
package com.codeing.snail.test; public class ReadWriteLockTest { public static void main(String[] args) { final Output output = new Output(); new Thread(){ public void run() { while(true){ output.output("CodeingSnail"); } }; }.start(); new Thread(){ public void run() { while(true){ output.output("陽光小強"); } }; }.start(); } static class Output{ public void output(String name){ char[] arry = name.toCharArray(); for(int i = 0; i < arry.length; i++){ System.out.print(arry[i]); } System.out.println(); } } }
輸出的結果如下:
如果我們想讓“CodeingSnail"和“陽光小強"兩個字符串都能完整輸出,就需要使用synchronized關鍵字將輸出部分聲明,如下:
public synchronized void output(String name){ char[] arry = name.toCharArray(); for(int i = 0; i < arry.length; i++){ System.out.print(arry[i]); } System.out.println(); }
其實,除了synchronized關鍵字之外,還可以使用鎖(Lock)來實現同步。
ReentrantLock lock = new ReentrantLock(); public void output(String name){ lock.lock(); try{ char[] arry = name.toCharArray(); for(int i = 0; i < arry.length; i++){ System.out.print(arry[i]); } System.out.println(); }finally{ lock.unlock(); } }上面代碼使用try...finally語句塊是為了防止出現異常執行不到unlock方法,ReentrantLock是Lock的實現類,Lock的作用和synchronized類似,但更加面向對象,要實現同步就必須使用同一個lock對象。
class CachedData { Object data; volatile boolean cacheValid; final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); void processCachedData() { rwl.readLock().lock(); if (!cacheValid) { // Must release read lock before acquiring write lock rwl.readLock().unlock(); rwl.writeLock().lock(); try { // Recheck state because another thread might have // acquired write lock and changed state before we did. if (!cacheValid) { data = ... cacheValid = true; } // Downgrade by acquiring read lock before releasing write lock rwl.readLock().lock(); } finally { rwl.writeLock().unlock(); // Unlock write, still hold read } } try { use(data); } finally { rwl.readLock().unlock(); } } }假如有多個線程來讀取數據,第一個線程進來先上一把寫鎖進行數據寫入(先釋放讀鎖),寫入完成後將寫鎖降級為讀鎖(第15行),其他線程在讀取數據的時候上讀鎖後互不影響。這樣可以提高讀取效率。
簡單的介紹了Android Studio代碼調試的一些技巧.現在呢,我們來談談android源碼編譯的一些事.(俺認為,作為android developer人人都應該有
在上一篇文章中我們已經完成對友盟SDK的基本集成,但是要滿足產品經理對一個APP的期望,基本集成的功能遠遠是不夠的,此時我們需要更進一步的集成友盟SDK的功能1.賬號統計
之前實現過了天氣預報的功能 但是真的好丑 真的只是實現功能 所以上一篇博客也沒有貼出圖片 這次 相對於第一個 首先是界面做了調整 其次就是 之前那個只能查看實時天氣 這個
背景先看效果圖:(以公司附近的國貿為中心點)上面是地圖,下面是地理位置列表,有的只有地理位置列表(QQ動態的位置),這是個很常見的功能。它有個專門的叫法:POI周邊搜索。