平時工作遇到的知識點

Java的NIO

阻塞與同步

阻塞:進程在訪問數據的時候,數據是否準備就緒的一種處理方式,當數據沒有準備的時候往往需要等待縗衝區中的數據準備好過後才處理其他的事情,否則一直等待在那裏。

 

非阻塞:當我們的進程訪問我們的數據緩衝區的時候,如果數據沒有準備好則直接返回,不會等待。如果數據已經準備好,也直接返回。

 

同步(Synchronization)和異步(Async)的方式:

同步:線程發起一個請求後,直到整個請求結束,線程不會開啓下一個任務。若請求途中發生阻塞,則線程一直等待直到有結果返回。一般會出現IO阻塞而一直等待。

 

異步:線程發起一個請求後,便可以轉而處理下個任務,等到之前的請求有通知後,在跳轉回來處理。例如有IO阻塞,則不會等待結果,而是開啓下個任務。

 

 

Java序列化:

Java序列化是指把java對象保存爲二進制字節碼的過程,java反序列化是指把二進制碼重新轉換成java對象的過程。

 

序列化主要在用在數據持久化、網絡傳輸等需要將數據傳遞或保存起來的地方。

主要是調用ObjectOutputStream.writeObject()和ObjectInputStream.readObject()來實現序列化。

// 根據實際的類型進行不同的寫入操作

        // remaining cases

        if (obj instanceof String) {

            writeString((String) obj, unshared);

        } else if (cl.isArray()) {

            writeArray(obj, desc, unshared);

        } else if (obj instanceof Enum) {

            writeEnum((Enum) obj, desc, unshared);

        } else if (obj instanceof Serializable) {

            // 被序列化對象實現了Serializable接口

            writeOrdinaryObject(obj, desc, unshared);

        } else {

            if (extendedDebugInfo) {

                throw new NotSerializableException(

                    cl.getName() + "\n" + debugInfoStack.toString());

            } else {

                throw new NotSerializableException(cl.getName());

            }

        }

 

Serializable接口這是一個標識,告訴程序所有實現了"我"的對象都需要進行序列化。

static和transient字段不能被序列化。

private static ObjectStreamField[] getDefaultSerialFields(Class<?> cl) {

    Field[] clFields = cl.getDeclaredFields();

    ArrayList<ObjectStreamField> list = new ArrayList<>();

    int mask = Modifier.STATIC | Modifier.TRANSIENT;

 

    for (int i = 0; i < clFields.length; i++) {

        if ((clFields[i].getModifiers() & mask) == 0) {

            // 如果字段既不是static也不是transient的纔會被加入到需要被序列化字段列表中去

            list.add(new ObjectStreamField(clFields[i], false, true));

        }

    }

    int size = list.size();

    return (size == 0) ? NO_FIELDS :

        list.toArray(new ObjectStreamField[size]);

}

 

在計算需要被序列化的字段的時候會把被static和transient修飾的字段給過濾掉。

 

 

Spi(service provide interface),即我們定義了服務接口標準,讓廠商去實現。Jdk通過ServiceLoader類實現spi機制的服務查找功能。

 

 

awk的處理文本和數據的方式是這樣的,它逐行掃描文件,從第一行到最後一行,尋找匹配的特定模式的行,並在這些行上進行你想要的操作。如果沒有指定處理動作,則把匹配的行顯示到標準輸出(屏幕),如果沒有指定模式,則所有被操作所指定的行都被處理。

 

netstat命令用於顯示與IP、TCP、UDP和ICMP協議相關的統計數據,一般用於檢驗本機各端口的網絡連接情況。

 

 

用tcpdump抓取到的數據包用wireshark打不開 isn't a capture file in a format wireshark understands.

 

已解決,原因是

 

tcpdump抓包寫入文件參數應該用 -w 而不是  >

 

 

 

例如:

 

tcpdump -i eth0 src host 192.168.1.*** > /tmp/info.pcap 

 

 這種格式用wireshark打不開

正確格式爲

 

tcpdump -i eth0 src host 192.168.1.*** -w /tmp/info.pcap

 

查看1433端口是否啓用 ,在cmd中執行   telnet 192.168.0.102  1433,如果顯示一個光標表示端口已經打開在用,否則未開啓該端口。

 

 

如查看8888商品是否啓用,在cmd中執行   netstat  -ano|findstr   "8888",如果顯示一行Tcp信息表示端口已經打開在用(該tcp信息最後一列的數字表示該端口對應的PID),沒有顯示內容表示未開啓該端口。

 

https://images2018.cnblogs.com/blog/733013/201806/733013-20180621121410609-1741572810.png

 

 

|wc –l  用來統計查詢匹配到的數據有多少行。

 

echo '--help' | xargs cat 等價於 cat --help 什麼意思呢,就是xargs將其接受的字符串 --help 做成cat的一個命令參數來運行cat命令,同樣  echo 'test.c test.cpp' | xargs cat 等價於 cat test.c test.cpp 此時會將test.c和test.cpp的內容都顯示出來。

 

cat 可以同時查看多個文件和過濾

 

windows上刪除8080端口的命令:

CMD>netstat -ano | findstr 808

這個命令輸出的最後一列表示佔用8080端口的進程號是多少,假設爲1234

2、kill掉這個進程

CMD>taskkill /F /PID 1234

這樣8080端口就是釋放了。

 

 

 

如何去除從SVN下載下來的項目,沒有修改文件卻有(*)星號:

在  window --> Preferences --> Team --> Ignored Resources 添加相應的 需要屏蔽的文件:(  .settings    .classpath      .project    target  */target/*)

 

 

https://blog.csdn.net/sgl520lxl/article/details/77452936

 

http://beautyboss.farbox.com/post/study/shen-ru-xue-xi-javaxu-lie-hua

 

http://www.cnblogs.com/yanzi-meng/p/9989082.html

 

 

Linux 內核設計與實現 第3版

 

 

大型網站技術架構:核心原理與案例分析

 

高擴展性網站的50條原則

 

 

微服務設計

 

Docker——容器與容器雲

 

分佈式服務架構:原理與實踐

 

 

 

Paxos解決共識問題,也就是一致性問題。

paxos協議是隻是一個協議,不是具體的一套解決方案。目的是解決多節點寫入問題。

 

 

ThreadLocal:爲變量在每個線程中都創建一個副本,那麼每個線程都可以訪問自己內部的副本變量。

每個Thread類中都有一個成員變量ThreadLocals(其實是一個ThreadLocalMap),用來存儲threadLocal變量。這個map以threadLocal自身作爲key。

ThreadLocal<Long> longLocal = new ThreadLocal<Long>();

ThreadLocal<String> stringLocal = new ThreadLocal<String>();

這麼定義的話,map裏面存放兩個key,longLocal和stringLocal。

threadLocal並不能代替同步機制,兩者面向的問題領域不同。同步機制是爲了同步多個線程對相同資源的併發訪問,而threadLocal是隔離了多個線程的數據共享,從根本上就不在多個線程之間共享資源。

 

 

 

進程和線程的區別?

進程是運行時程序的封裝,是系統進行資源調度和分配的基本單位,實現了操作系統的併發;

線程是進程的子任務,是cpu調度和分派的基本單位,實現進程內部的併發。

線程依賴於進程而存在

進程在執行過程中擁有獨立的內存單元,而多個線程共享進程的內存。

 

進程通信方式有哪些?

管道及命名管道:管道用於具有親緣關係的父子進程間的通信,而命名管道可以在無親緣關係進程間通信。

 

信號:較複雜,用於通知接收進程某個事件已經發生。

 

消息隊列:類似於MQ

 

共享內存:多個進程共享同一塊內存空間。

 

套接字:用於網絡中不同機器之間的進程間通信。

 

線程同步的方式?

互斥量(synchronized/Lock):採用互斥對象機制,只有擁有互斥對象的線程纔有訪問公共資源的權限。

信號量(semphare):允許同一時刻多個線程訪問同一資源,但是需要控制同一時刻訪問此資源的最大線程數量。

事件信號(wait/notify):通過通知操作來保持多線程同步。

 

進程的幾種狀態?

就緒狀態:進程已獲得所需資源,等待分配處理機資源

運行狀態:佔用處理機資源運行

阻塞狀態:進程等待某種條件,在條件滿足之前無法執行

 

進程調度策略有哪幾種?

FCFS(first come first server):先請求cpu的進程先分配到cpu。

優先級調度算法:優先級越高越先分配到cpu。

時間片輪轉調度算法:如果進程的cpu區間超過一個時間片,那麼該進程就被搶佔並放回就緒隊列。

多級隊列調度算法:將就緒隊列分成多個獨立的隊列,每個隊列有自己的調度算法。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章