讀寫是兩個(gè)不同的分支,通常都是分開單獨(dú)使用的,在讀取到每行內(nèi)容后,通過特定的條件判斷即可獲取到應(yīng)用的行內(nèi)容,之后進(jìn)行輸出即可。
公司主營業(yè)務(wù):做網(wǎng)站、網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出贛縣免費(fèi)做網(wǎng)站回饋大家。
舉例:
可以通過BufferedReader 流的形式進(jìn)行流緩存,之后通過readLine方法獲取到緩存的內(nèi)容。
BufferedReader bre = null;
try {
String file = "D:/test/test.txt";
bre = new BufferedReader(new FileReader(file));//此時(shí)獲取到的bre就是整個(gè)文件的緩存流
while ((str = bre.readLine())!= null) // 判斷最后一行不存在,為空結(jié)束循環(huán)
{
System.out.println(str);//原樣輸出讀到的內(nèi)容,此處如果增加必要的條件,就可以貨到的指定的內(nèi)容
};
可以通過“FileOutputStream”創(chuàng)建文件實(shí)例,之后過“OutputStreamWriter”流的形式進(jìn)行存儲,
OutputStreamWriter pw = null;//定義一個(gè)流
pw = new OutputStreamWriter(new FileOutputStream(“D:/test.txt”),"GBK");//確認(rèn)流的輸出文件和編碼格式,此過程創(chuàng)建了“test.txt”實(shí)例
pw.write("我是要寫入到記事本文件的內(nèi)容");//將要寫入文件的內(nèi)容,可以多次write
pw.close();//關(guān)閉流
備注:文件流用完之后必須及時(shí)通過close方法關(guān)閉,否則會一直處于打開狀態(tài),直至程序停止,增加系統(tǒng)負(fù)擔(dān)。
小白ぁ棉花糖 說的沒錯(cuò),是你少了flush()操作。
而你所說的,“不是這樣的,我找到原因了,源文件中有些字符是超出int的表示范圍的,所以其中這些超出范圍的字符并沒有被讀取,被漏掉了,所以比原來文件小”,我可以肯定地告訴你,你被誤導(dǎo)或者你自己理解錯(cuò)誤了!!
br.read()方法是返回一個(gè)字節(jié),一個(gè)字節(jié)能表示的范圍,int已經(jīng)足夠?。?/p>
計(jì)算機(jī)中,任何數(shù)據(jù)都是由字節(jié)組成的。。
此外提一下,你這樣做的效率會很低,不要一個(gè)一個(gè)字節(jié)來讀取,應(yīng)該是:
byte[] data=new byte[10*1024];
int n=br.read(data);
while(n!=-1){
fw.write(data,0,n);
n=br.read(data);
}
fw.flush();
fw.close();
...
你對比下,我這個(gè)的速度肯定會比你的快,尤其是復(fù)制大文件的時(shí)候更明顯
Java經(jīng)典面試題 帶答案(二) 原創(chuàng)
2022-04-29 14:34:07
?
qdwd888 ?
碼齡1年
關(guān)注
所謂引用傳遞就是把一個(gè)對象在堆中保存的數(shù)據(jù)傳遞給一個(gè)變量,此時(shí)新的變量與原有的變量對應(yīng)同一個(gè)內(nèi)存存儲空間,當(dāng)新的變量修改對象的屬性時(shí),內(nèi)存中的數(shù)據(jù)也會修改。
3.接口與抽象類的區(qū)別?
1:接口里面不可以實(shí)現(xiàn)方法體,抽象類可以實(shí)現(xiàn)方法體。
2:接口可以多繼承接口,抽象類不可以。
3:接口需要被子類實(shí)現(xiàn),抽象類是要被子類繼承(單一繼承)。
4:接口中只能有公有的方法和屬性而且必須賦初始值,抽象類中可以有私有方法和屬性.
5: 接口中不能存在靜態(tài)方法,但屬性可以和final,抽象類中方法中可以有靜態(tài)方法,屬性也可以。
4.談?wù)劺^承,為什么要使用繼承?
所謂繼承就是找出幾個(gè)類中共同的部分,提取出來作為父類。而子類只需要繼承父類,就可以共享父類的方法。
使用繼承能夠減少重復(fù)的代碼。
5.方法重載的好處?
所謂重載就是在一個(gè)類中可以定義多個(gè)相同的方法,但是方法的參數(shù)類型和參數(shù)的個(gè)數(shù)以及順序要不同。
重載的好處就是能夠讓我們很快的掌握該方法的功能,我們只要要記住該方法就能很快的理解該方法的參數(shù)以及參數(shù)的作用
6.項(xiàng)目中印象最深的部分?
我覺得在該項(xiàng)目中我體現(xiàn)到了反射技術(shù)的強(qiáng)大之處,原來我一直不清楚反射是一種什么樣的技術(shù),只知道一些概念上的知識,經(jīng)過這個(gè)項(xiàng)目之后,終于知道該怎樣靈活運(yùn)用反射,以及在什么時(shí)候運(yùn)用。
談?wù)勀銓γ嫦驅(qū)ο蟮睦斫馀c認(rèn)識?
我覺得使用面向?qū)ο筮@種思維的方式比較符合我們?nèi)祟惖乃枷耄恍枰W(xué)習(xí)一些什么新的思考方式,就按照現(xiàn)實(shí)生活做的一些故事就能讓人理解該內(nèi)容的知識以及他們的作用。
我的看法就是:
1:當(dāng)加入新的功能的時(shí)候不會修改原有的代碼。(面向接口編程)
2: 當(dāng)我們寫的一個(gè)類可以重復(fù)的運(yùn)用在其他項(xiàng)目中。(代碼的復(fù)用性)
3:當(dāng)寫一個(gè)新類的時(shí)候要考慮到他的可擴(kuò)展性。(靈活性)
7.談?wù)劶峡蚣?
集合框架分為三部分,第一部分是collection接口,第二部分是Map接口、第三部分是collections幫助類
首先說一下collection接口,collection接口下面的接口分為set接口、list接口,在往下面就是他們一些實(shí)現(xiàn)類。
說到實(shí)現(xiàn)類在分為兩部分,第一部分是set的實(shí)現(xiàn)類有TreeSet、HashSet,第二部分是list的實(shí)現(xiàn)類有: Arraylist、LinkedList、Vector。
8.再說Map接口,map接口下面有treeMap、HashMap、HashTable三個(gè)實(shí)現(xiàn)類。
最后說collections幫助類,collections提供了一系列靜態(tài)方法實(shí)現(xiàn)對各種集合的搜索、排序、線程完全化等操作。
9.什么是異常?描述下異常處理?
所謂異常就在執(zhí)行程序的時(shí)發(fā)生的錯(cuò)誤,他能終止正在執(zhí)行的程序。
異常的處理:1:使用try-catch捕獲異常。
2:使用throw-throws拋出異常。
10.多線程的優(yōu)先級?為什么要分優(yōu)先級?
因?yàn)橛杏幸恍┚€程可能比較重要,所以才劃分優(yōu)先級。
異常框架的類結(jié)構(gòu)?
Throwable所有錯(cuò)誤的超類,他下面有兩個(gè)子類:error和Exception。
error代表系統(tǒng)級的錯(cuò)誤能捕獲,但是不能處理。
Exception代表異常主要出自于程序,可以捕獲也能處理。Exception有分為兩類:編譯期異常、運(yùn)行期異常。
區(qū)別他是運(yùn)行期異常還是編譯期異常就看他是不是RuntimeException的子類,如果是的話,就是運(yùn)行期異常否則是編譯期異常。
談?wù)凥ashMap與Hashtable的區(qū)別。
HashMap:hashmap中可以有空值,線程不安全的類。hashmap的父類是abstractMap抽象類(效率高)
HashTable:hashtable中不允許有空值,線程安全的類.hashtable的父類是Dictionary類(效率低)
說一下iterator。
iterator是一個(gè)接口,用于實(shí)現(xiàn)對容器里面的元素遍歷操作。
任何的遍歷都可以使用iterator。
什么是泛型?它有什么樣的好處?
泛型就是自己指定一種類型,以后存放的東西就只能有這一種類型。
泛型的好處是在編譯的時(shí)候檢查類型安全,并且所有的強(qiáng)制轉(zhuǎn)換都是自動和隱式的,提高代碼的重用率。
說一下你在項(xiàng)目中遇到的異常,并說出什么時(shí)候發(fā)生的,怎么解決的。
空指針異常最常見。根據(jù)異常提示找到相應(yīng)的類進(jìn)行處理。發(fā)生的原因很多,比如沒有初始化變量,沒有進(jìn)行賦值等都是空指針?biāo)摹?/p>
你的程序遇到錯(cuò)時(shí)怎么解決的?
根據(jù)錯(cuò)誤提示找到錯(cuò)誤的API進(jìn)行相應(yīng)的處理。
談?wù)労偷膮^(qū)別
是位運(yùn)算符,表示按位與運(yùn)算,是邏輯運(yùn)算符,表示邏輯與(and)。
System.out和System.in是什么意思?
System.out是輸出。
System.in是輸入
java為什么能夠跨平臺?
對于不同的系統(tǒng)平臺有不同的虛擬機(jī),虛擬機(jī)提供了硬件平臺規(guī)范。
用java開發(fā)的程序被編譯成由java虛擬機(jī)指令組成的字節(jié)代碼,虛擬機(jī)會將這些指令翻譯成操作系統(tǒng)特定的指令.(因?yàn)閖vm屏蔽了底層操作系統(tǒng)的硬件)。
private變量能不能被其他類訪問?如果能,怎么訪問?
能。通過反射. getDeclaredField_r();
演示java項(xiàng)目如何打包成jar文件
1:選擇導(dǎo)出 jar 直到輸出
java的環(huán)境變量如何配置?為什么要配置?
1:在我的電腦 屬性 高級 環(huán)境變量 系統(tǒng)變量 新建 變量名 java-Home,設(shè)置值:java的JDK目錄
2:在選擇新建 設(shè)置變量名 PATH 變量值 %java_home%/bin目錄
為了方便在dos窗口操作。
static和非static修飾的變量哪個(gè)生命周期長?
static的生命周期長。因?yàn)樗恢痹趦?nèi)存里面。
什么是線程同步?
線程同步就是說在同一時(shí)間訪問的資源的時(shí)候,資源只能被一個(gè)線程所使用.
什么是封裝?封裝的好處是什么?
封裝:封裝就是把一個(gè)已經(jīng)實(shí)現(xiàn)好的功能的代碼,放在一個(gè)方法中(實(shí)現(xiàn)了隱藏)。
好處:代碼的重用性、好全性、只需要調(diào)用該方法不管具體的實(shí)現(xiàn)
在線程中wait與sleep的區(qū)別?
1:wait是Object定義的方法,而sleep是線程Thread定義的方法。
2:sleep是讓當(dāng)前線程睡泯,所以可以放在任何位置,而wait是讓當(dāng)前線程放棄資源的使用權(quán),必須放在同步塊或同步方法里面。
3:sleep他不會釋放對象鎖,而wait會釋放對象同步鎖.
4:sleep是等待一段時(shí)間后會自動醒來,而wait必須讓其他的線程喚醒。
Class 和class的區(qū)別
class是java的關(guān)鍵字。
Class是類的名字。
awt和swing的區(qū)別?
awt是重量級的組件。
swing是輕量級的組件.
比如:(在swing組件中當(dāng)我們調(diào)用repaint()方法時(shí),會很快調(diào)用paint(),而對于重量級組件會首先調(diào)用upate()方法,然后upate()方法再調(diào)用paint()方法,在重量級組件中實(shí)現(xiàn)雙緩沖,我們就要重寫upate()方法,在重寫的時(shí)候記得實(shí)現(xiàn)帥新屏幕).
為什么實(shí)現(xiàn)一個(gè)接口必須要實(shí)現(xiàn)接口里面所有的方法?
因?yàn)檫@是sun公司的規(guī)定。如果不實(shí)現(xiàn)它里面所有的方法那就不叫接口。
線程和進(jìn)程的區(qū)別是什么?
進(jìn)程是一個(gè)小的應(yīng)用程序,需要分配內(nèi)存空間。
線程是進(jìn)程中的一個(gè)順序控制流,也可以這樣理解(線程是進(jìn)程的實(shí)體).
Java基礎(chǔ)技能中強(qiáng)調(diào)程序代碼的讀寫能力,如果一個(gè)類很長,你會怎樣讀寫?
1:類分解,每個(gè)類只做他該做的事情。
2:方法分解。
抽象方法能不能是private和static修飾符?
能。
用接口有什么好處?
1:使用接口有很好的擴(kuò)展性。
2:接口可以多繼承接口。
3:隱藏實(shí)現(xiàn)。
什么是反射?
所謂反射就是在編譯的時(shí)候不知道加載什么,只有等到運(yùn)行的時(shí)候才知道該執(zhí)行什么。
創(chuàng)建對象的方式有哪些?
1:new 2:反射 3:clone 4:反序列化
transient是什么意思?
transient代表無法到達(dá)某一對象所拋出的異常。但也不代表沒有該對象。
在設(shè)計(jì)類的時(shí)候,你是怎么使用靜態(tài)變量和成員變量的?
如果需要一直存在于內(nèi)存當(dāng)中,就選擇靜態(tài)變量否則就選擇成員變量。
定義 《一線大廠Java面試題解析+后端開發(fā)學(xué)習(xí)筆記+最新架構(gòu)講解視頻+實(shí)戰(zhàn)項(xiàng)目源碼講義》無償開源 威信搜索公眾號【編程進(jìn)階路】 抽象方法的意義何在?
1:為了減少重復(fù)代碼。
2:抽象方法有很好的擴(kuò)展性。
談集合遍歷的方式
forEach()、for()、iterator
java安全性體現(xiàn)在什么地方? 1:Java提供一個(gè)用于網(wǎng)絡(luò)/分布式的計(jì)算環(huán)境。因此,Java強(qiáng)調(diào)安全性,如確保無病毒、小應(yīng)用程序運(yùn)行安全控制等等。
2:Java的驗(yàn)證技術(shù)是以公鑰(public-key)加密算法為基礎(chǔ),而且從環(huán)境變量、類加載器、文件系統(tǒng)、網(wǎng)絡(luò)資源和名字空間等方面實(shí)施安全策略。
談?wù)劸€程所擁有的幾種狀態(tài)
就緒:線程分配了CPU以外的全部資源,等待獲得CPU調(diào)度
執(zhí)行:線程獲得CPU,正在執(zhí)行
阻塞:線程由于發(fā)生I/O或者其他的操作導(dǎo)致無法繼續(xù)執(zhí)行,就放棄處理機(jī),轉(zhuǎn)入線程就緒隊(duì)列
掛起:由于終端請求,操作系統(tǒng)的要求等原因,導(dǎo)致掛起。
面向?qū)ο蟮奶卣饔心男?
封裝、繼承、多態(tài)
解釋一下在項(xiàng)目里你怎么去實(shí)現(xiàn)多線程的。
1:一般是實(shí)現(xiàn)Runnable接口,new Thread().start(); 重寫run();
啟動線程時(shí)可以調(diào)用run()方法嗎?
可以.因?yàn)閞un方法里面執(zhí)行的代碼就是線程所要執(zhí)行的方法.
Java程序的執(zhí)行過程是怎樣的?
java源程序 編譯.class字節(jié)碼 類加載器 字節(jié)碼校驗(yàn)器 解釋執(zhí)行
Java的引用數(shù)據(jù)類型有哪些?
對象、集合、數(shù)組、接口
變量按作用域分類分為幾種?
分為兩種。局部變量和全局變量.
集合里的接口有哪些?請你創(chuàng)建一個(gè)List類的實(shí)例。
Collection接口、set接口、list接口、map接口、iterator接口
List list = new ArrayList();
int與Integer的區(qū)別?
int是原始數(shù)據(jù)類型,integer是int的包裝類,他提供轉(zhuǎn)換類型的很多方法。
checked異常與unchecked異常的區(qū)別是什么?
區(qū)分他們的區(qū)別主要是看他們是不是runtime的子類,如果是runtime的子類那么就是運(yùn)行期異常,否則是編譯期異常。
final與finally、finalize的區(qū)別?
final用于聲明屬性、方法和類,分別表示屬性不可更改,方法不可重寫,類不可以繼承。
finally是異常處理語句結(jié)構(gòu)的一部分,他表示總是執(zhí)行。
finalize是Object類的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會調(diào)用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時(shí)的其他資源回收,例如關(guān)閉文件等。
重寫與重載的區(qū)別?參數(shù)一樣,返回類型不一樣 是重載嗎?
重載:方法名相同,參數(shù)類型不同,參數(shù)個(gè)數(shù)不同,參數(shù)順序不同。
重寫:方法名相同,參數(shù)的類型相同,返回的類型相同。
不是。因?yàn)橹剌d是根據(jù)參數(shù)來斷定的。
寫一個(gè)數(shù)組的創(chuàng)建。
int[] i = new int[5];
int[] i={1,2,3,4,5};
什么時(shí)候用輸入流,什么時(shí)候用輸出流?
讀取數(shù)據(jù)的時(shí)候使用輸入流。
寫入數(shù)據(jù)的時(shí)候使用輸出流.
雙緩沖如何實(shí)現(xiàn)的?為什么要用雙緩沖?
先在內(nèi)存中分配一個(gè)和我門動畫窗口一樣大的空間(在內(nèi)存中的空間我門是看不到的),然后利用 getGraphics_r()方法去獲得給空間并將它全部一次性的顯示到我門的屏幕上.這樣在我門的動畫窗口上面是顯示出來就非常的流暢了.避免了上面的閃爍效果.
舉出常用的list類。哪種情況用哪種好?
arraylist、LinkedList、Vector.
arraylist是連續(xù)的空間,遍歷速度快,插入和刪除就比較慢。
linkedList是一個(gè)雙向鏈表存放數(shù)據(jù)。如果刪除和添加元素比較多的話,要效率高的就可以使用LinkedList。
vector和arraylist的功能一樣,唯一的區(qū)別就是vector是線程安全的,而arraylist是線程不安全的。
Map、list與set的區(qū)別?里面常用的類有哪些?
map是以鍵值對的方式存數(shù)據(jù)。
list里面的數(shù)據(jù)可以重復(fù),有順序
set里面的數(shù)據(jù)不可以重復(fù),沒有順序。
list的常用類有arraylist
set的常用類有treeset
map的常用類用hashmap
什么時(shí)候用繼承Thread?什么時(shí)候?qū)崿F(xiàn)Runnable接口?
當(dāng)一個(gè)類中沒有繼承的時(shí)候可以使用thread。
如果一個(gè)類中已經(jīng)使用了繼承,就只有實(shí)現(xiàn)runnable接口
對對象進(jìn)行比較怎么做?為什么不用“==”?
其實(shí)如果是非String的話,==與equals并沒有區(qū)別。
因?yàn)镾tring他是重寫了object的方法,所以這才有了equals比較內(nèi)容,==比較地址。
靜態(tài)變量與成員變量的區(qū)別。
靜態(tài)變量在對象加載之前初始化,而成員變量是在編譯期間初始化。
靜態(tài)變量可以直接通過類名點(diǎn)的方式進(jìn)行訪問,而成員變量則不行。
訪問修飾符有哪幾種?它們之間的區(qū)別是什么?
有四種。
前提:在一個(gè)項(xiàng)目中。
public可以在所有包中的所有類隨意進(jìn)行訪問。
private只能在被當(dāng)前類訪問。
protected:在同一包中,或子類可以進(jìn)行訪問。
默認(rèn):同包下能被訪問。
對象的序列化怎么實(shí)現(xiàn)的?
實(shí)現(xiàn)Serializable接口。
講一下多態(tài)的概念。
多態(tài)就是相同的行為不同的體現(xiàn)方式。(比如:愛好,每個(gè)人都要自己的愛好,但是愛好都不同)
子類繼承父類,父類的構(gòu)造方法能被繼承嗎?
能。
子類中怎么調(diào)用父類的方法?
通過super.方法
this、super的用法與區(qū)別?
this的訪問當(dāng)前類的屬性和方法。
super是訪問父類的屬性和方法。
什么是構(gòu)造方法?構(gòu)造方法的作用?(目的、意義)
構(gòu)造方法是在調(diào)用的時(shí)候被new出來的,每個(gè)類都有構(gòu)造方法。
作用:為對象分配內(nèi)存、初始化類變量、初始化屬性、返回引用。
Error和Exception的區(qū)別是什么?
Error:是系統(tǒng)級的錯(cuò)誤,可以捕獲,但不同處理。
exception是程序錯(cuò)誤,可以捕獲也可以進(jìn)行處理。
輸入輸出流分幾種?分別在什么時(shí)候使用?
輸入流:InputStream、Read
輸出流:OutputStream、writer
讀取字節(jié),使用InputStream 以字符讀取用Read
輸出字節(jié),使用OutputStream 以字符輸出用writer
異常捕獲的流程?如果有異常發(fā)生是怎樣的流程?
try{
容易發(fā)生異常的代碼
}catch(錯(cuò)誤的類型){
打印錯(cuò)誤信息
}finally{
不管有沒有異常都要執(zhí)行
}
String是基本數(shù)據(jù)類型嗎?基本數(shù)據(jù)類型有哪些?
不是。
基本數(shù)據(jù)類型:byte、short、int、long、float、double、char、boolean
Collection與Collections的區(qū)別?
Collection是一個(gè)接口.
collections是一個(gè)幫助類。(主要對查找、排序)
HashMap等是實(shí)現(xiàn)的 Collection的接口嗎?
不是。
hashMap實(shí)現(xiàn)的是map接口。他是以鍵值對的形式保存。
游戲中的paint()方法從何處來的?讓窗本重繪最好采用哪種方法?
NO!!!沒做過。
為什么從集合中取出來的元素都是Object類型的?.
因?yàn)樗麄兌际莖bject的子類。
如果try塊中有多種異常,在catch塊中如何處理?
直接在類型catch中寫一個(gè)Exception異常。
如果要拋出異常怎么做?
使用throw明確要拋出異常的代碼,在方法中使用throws拋出異常類型。
實(shí)現(xiàn)接口使用什么關(guān)鍵字?在實(shí)現(xiàn)一個(gè)接口時(shí)必須要做什么?
使用interface關(guān)鍵字。
實(shí)現(xiàn)一個(gè)接口必須實(shí)現(xiàn)這個(gè)接口里面的所有方法.
GUI響應(yīng)一個(gè)事件的代碼如何寫?
確定事件源;確定監(jiān)聽器,監(jiān)聽器需要實(shí)現(xiàn)監(jiān)聽器接口,重寫其中的方法;完成事件源和監(jiān)聽器的注冊
JVM是什么?它的作用是什么?它和java運(yùn)行環(huán)境有什么區(qū)別?
Java虛擬機(jī)是一個(gè)抽象的計(jì)算機(jī),和實(shí)際的計(jì)算機(jī)一樣,它具有一個(gè)指令集并使用不同的存儲區(qū)域。
它負(fù)責(zé)執(zhí)行指令,還要管理數(shù)據(jù)、內(nèi)存和寄存器。Java解釋器負(fù)責(zé)將字節(jié)代碼翻譯成特定機(jī)器的機(jī)器代碼
沒有java虛擬機(jī)就更不要說運(yùn)行環(huán)境了。
集合和數(shù)組的區(qū)別。
1:集合中可以存放不同元素的類型,而數(shù)組中只能放同一種類型的數(shù)據(jù)。
2:集合的長度可以隨著元素的多少自動增長,而數(shù)據(jù)的長度一旦定義就不能更改。
3:集合中只能放置對象,數(shù)組中可以是對象也可以基本數(shù)據(jù)類型。
4:集合提供了很好的算法,而數(shù)組里面的算法有限。
final這個(gè)修飾符的用法?
final主要修飾屬性、方法、類。分別代表屬性的值不可更改、方法不可以重寫、類不可以繼承。
如何定義一個(gè)常量?定義常量的意義何在?
讀-寫互斥:加個(gè)boolean writeFlag = false;寫的時(shí)候保持該值為true,有讀操作的時(shí)候判斷該值是否為false,否則等待讀。
讀者優(yōu)先的附加限制:即多個(gè)讀操作可以同時(shí)進(jìn)行。
寫者優(yōu)先的附加限制:設(shè)置線程的優(yōu)先級,保持寫的線程優(yōu)先級始終高于讀線程的優(yōu)先級。