国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

紀(jì)念我曾經(jīng)的 JAVA 姿勢(shì)

The question / 1989人閱讀

摘要:,關(guān)閉不當(dāng)編譯器警告信息。創(chuàng)建固定大小的線程池。此線程池不會(huì)對(duì)線程池大小做限制,線程池大小完全依賴于操作系統(tǒng)或者說能夠創(chuàng)建的最大線程大小。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。

目前在搞 Node.js,曾經(jīng)的 JAVA 知識(shí)忘了好多,為此整理了下,感嘆下工業(yè)語言還是有相當(dāng)?shù)膬?yōu)勢(shì)的。

Java所有的流類位于java.io包中,都分別繼承字以下四種抽象流類型。

Type 字節(jié)流 字符流
輸入流 InputStream Reader
輸出流 OutputStream Writer

繼承自InputStream/OutputStream的流都是用于向程序中輸入/輸出數(shù)據(jù),且數(shù)據(jù)的單位都是字節(jié)(byte=8bit)。

繼承自Reader/Writer的流都是用于向程序中輸入/輸出數(shù)據(jù),且數(shù)據(jù)的單位都是字符(2byte=16bit)。

異常

Java的異常(包括ExceptionError)分為:

可查的異常(checked exceptions)

除了RuntimeException及其子類以外,其他的Exception類及其子類都屬于可查異常。這種異常的特點(diǎn)是Java編譯器會(huì)檢查它,也就是說,當(dāng)程序中可能出現(xiàn)這類異常,要么用try-catch語句捕獲它,要么用throws子句聲明拋出它,否則編譯不會(huì)通過。

不可查的異常(unchecked exceptions)

包括運(yùn)行時(shí)異常(RuntimeException與其子類)和錯(cuò)誤(Error)。

運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常:

RuntimeException

NullPointerException(空指針異常)、IndexOutOfBoundsException(下標(biāo)越界異常)等這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯(cuò)誤引起的,程序應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生。運(yùn)行時(shí)異常的特點(diǎn)是Java編譯器不會(huì)檢查它,也就是說,當(dāng)程序中可能出現(xiàn)這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會(huì)編譯通過。

RuntimeException以外的Exception

從程序語法角度講是必須進(jìn)行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。

返回目錄

注解

Java SE5內(nèi)置了三種標(biāo)準(zhǔn)注解:

 @Override,表示當(dāng)前的方法定義將覆蓋超類中的方法。

 @Deprecated,使用了注解為它的元素編譯器將發(fā)出警告,因?yàn)樽⒔釦Deprecated是不贊成使用的代碼,被棄用的代碼。

 @SuppressWarnings,關(guān)閉不當(dāng)編譯器警告信息。

Java還提供了4中注解,專門負(fù)責(zé)新注解的創(chuàng)建:

@Target:

表示該注解可以用于什么地方,可能的ElementType參數(shù)有:
CONSTRUCTOR:構(gòu)造器的聲明
FIELD:域聲明(包括enum實(shí)例)
LOCAL_VARIABLE:局部變量聲明
METHOD:方法聲明
PACKAGE:包聲明
PARAMETER:參數(shù)聲明
TYPE:類、接口(包括注解類型)或enum聲明

@Retention

表示需要在什么級(jí)別保存該注解信息。可選的RetentionPolicy參數(shù)包括:
SOURCE:注解將被編譯器丟棄
CLASS:注解在class文件中可用,但會(huì)被VM丟棄
RUNTIME:VM將在運(yùn)行期間保留注解,因此可以通過反射機(jī)制讀取注解的信息

@Document

將注解包含在Javadoc中

@Inherited

允許子類繼承父類中的注解

Example

定義注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
    public String id();
    public String description() default "no description";
}

使用注解:

public class PasswordUtils {
     @UseCase(id = 47, description = "Passwords must contain at least one numeric")
     public boolean validatePassword(String password) {
         return (password.matches("w*dw*"));
     }
 
     @UseCase(id = 48)
     public String encryptPassword(String password) {
         return new StringBuilder(password).reverse().toString();
     }
 }

解析注解:

public static void main(String[] args) {
     List useCases = new ArrayList();
     Collections.addAll(useCases, 47, 48, 49, 50);
     trackUseCases(useCases, PasswordUtils.class);
 }
 
 public static void trackUseCases(List useCases, Class cl) {
     for (Method m : cl.getDeclaredMethods()) {
         UseCase uc = m.getAnnotation(UseCase.class);
         if (uc != null) {
             System.out.println("Found Use Case:" + uc.id() + " "
                         + uc.description());
             useCases.remove(new Integer(uc.id()));
         }
     }
     for (int i : useCases) {
         System.out.println("Warning: Missing use case-" + i);
     }
 }
 // Found Use Case:47 Passwords must contain at least one numeric
 // Found Use Case:48 no description
 // Warning: Missing use case-49
 // Warning: Missing use case-50

返回目錄

安全性

嚴(yán)格遵循面向?qū)ο蟮囊?guī)范。這樣封裝了數(shù)據(jù)細(xì)節(jié),只提供接口給用戶。增加了數(shù)據(jù)級(jí)的安全性。

無指針運(yùn)算。java中的操作,除了基本類型都是引用的操作。引用是不能進(jìn)行增減運(yùn)算,不能被直接賦予內(nèi)存地址的,從而增加了內(nèi)存級(jí)的安全性。

數(shù)組邊界檢查。這樣就不會(huì)出現(xiàn)C/C++中的緩存溢出等安全漏洞。

強(qiáng)制類型轉(zhuǎn)換。非同類型的對(duì)象之間不能進(jìn)行轉(zhuǎn)換,否則會(huì)拋出ClassCastException

語言對(duì)線程安全的支持。java從語言級(jí)支持線程。從而從語法和語言本身做了很多對(duì)線程的控制和支持。

垃圾回收。

Exception。

返回目錄

類加載 原理

ClassLoader使用的是雙親委托模型來搜索類的,每個(gè)ClassLoader實(shí)例都有一個(gè)父類加載器的引用(不是繼承的關(guān)系,是一個(gè)包含的關(guān)系),虛擬機(jī)內(nèi)置的類加載器(Bootstrap ClassLoader)本身沒有父類加載器,但可以用作其它ClassLoader實(shí)例的的父類加載器。

當(dāng)一個(gè)ClassLoader實(shí)例需要加載某個(gè)類時(shí),它會(huì)試圖親自搜索某個(gè)類之前,先把這個(gè)任務(wù)委托給它的父類加載器,這個(gè)過程是由上至下依次檢查的,首先由最頂層的類加載器Bootstrap ClassLoader試圖加載,如果沒加載到,則把任務(wù)轉(zhuǎn)交給Extension ClassLoader試圖加載,如果也沒加載到,則轉(zhuǎn)交給App ClassLoader?進(jìn)行加載,如果它也沒有加載得到的話,則返回給委托的發(fā)起者,由它到指定的文件系統(tǒng)或網(wǎng)絡(luò)等URL中加載該類。

如果它們都沒有加載到這個(gè)類時(shí),則拋出ClassNotFoundException異常。否則將這個(gè)找到的類生成一個(gè)類的定義,并將它加載到內(nèi)存當(dāng)中,最后返回這個(gè)類在內(nèi)存中的Class實(shí)例對(duì)象。

JVM在判定兩個(gè)class是否相同時(shí),不僅要判斷兩個(gè)類名是否相同,而且要判斷是否由同一個(gè)類加載器實(shí)例加載的。只有兩者同時(shí)滿足的情況下,JVM才認(rèn)為這兩個(gè)class是相同的。

加載器

BootStrap ClassLoader

啟動(dòng)類加載器,是Java類加載層次中最頂層的類加載器,負(fù)責(zé)加載JDK中的核心類庫,如:rt.jar、resources.jar、charsets.jar等。

   URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
   for (int i = 0; i < urls.length; i++) {
       System.out.println(urls[i].toExternalForm());? 
   }
   // 也可以通過sun.boot.class.path獲取
   System.out.println(System.getProperty("sun.boot.class.path"))

Extension ClassLoader

擴(kuò)展類加載器,負(fù)責(zé)加載Java的擴(kuò)展類庫,默認(rèn)加載JAVA_HOME/jre/lib/ext/目下的所有jar。

App ClassLoader

系統(tǒng)類加載器,負(fù)責(zé)加載應(yīng)用程序classpath目錄下的所有jar和class文件

注意

除了Java默認(rèn)提供的三個(gè)ClassLoader之外,用戶還可以根據(jù)需要定義自已的ClassLoader,而這些自定義的ClassLoader都必須繼承自java.lang.ClassLoader類,也包括Java提供的另外二個(gè)ClassLoader(Extension ClassLoader和App ClassLoader)在內(nèi)。Bootstrap ClassLoader不繼承自ClassLoader,因?yàn)樗皇且粋€(gè)普通的Java類,底層由C++編寫,已嵌入到了JVM內(nèi)核當(dāng)中,當(dāng)JVM啟動(dòng)后,Bootstrap ClassLoader也隨著啟動(dòng),負(fù)責(zé)加載完核心類庫后,并構(gòu)造Extension ClassLoader和App ClassLoader類加載器。

返回目錄

關(guān)鍵字

strictfp(strict float point)

strictfp 關(guān)鍵字可應(yīng)用于類、接口或方法。使用strictfp關(guān)鍵字聲明一個(gè)方法時(shí),該方法中所有的float和double表達(dá)式都嚴(yán)格遵守FP-strict的限制,符合IEEE-754規(guī)范。當(dāng)對(duì)一個(gè)類或接口使用strictfp關(guān)鍵字時(shí),該類中的所有代碼,包括嵌套類型中的初始設(shè)定值和代碼,都將嚴(yán)格地進(jìn)行計(jì)算。嚴(yán)格約束意味著所有表達(dá)式的結(jié)果都必須是 IEEE 754算法對(duì)操作數(shù)預(yù)期的結(jié)果,以單精度和雙精度格式表示。

如果你想讓你的浮點(diǎn)運(yùn)算更加精確,而且不會(huì)因?yàn)椴煌挠布脚_(tái)所執(zhí)行的結(jié)果不一致的話,可以用關(guān)鍵字strictfp。

transiant

變量修飾符,如果用transient聲明一個(gè)實(shí)例變量,當(dāng)對(duì)象存儲(chǔ)時(shí),它的值不需要維持。

volatile

作為指令關(guān)鍵字,確保本條指令不會(huì)因編譯器的優(yōu)化而省略,修飾變量,保證變量每次都是從內(nèi)存中重新讀取。

final

修飾基礎(chǔ)數(shù)據(jù)成員(as const)

修飾類或?qū)ο蟮囊?/p>

修飾方法的final(cannot overwrite)

修飾類或者參數(shù)

返回目錄

初始化

父靜態(tài)->子靜態(tài)
父變量->父初始化區(qū)->父構(gòu)造
子變量->子初始化區(qū)->子構(gòu)造

多線程

JAVA多線程實(shí)現(xiàn)方式主要有三種:繼承Thread類、實(shí)現(xiàn)Runnable接口、使用ExecutorService、Callable、Future實(shí)現(xiàn)有返回結(jié)果的多線程。其中前兩種方式線程執(zhí)行完后都沒有返回值,只有最后一種是帶返回值的。

返回目錄

線程池

concurrent下的線程池

名稱 功能
ExecutorService 真正的線程池接口
ScheduledExecutorService 能和Timer/TimerTask類似,解決那些需要任務(wù)重復(fù)執(zhí)行的問題
ThreadPoolExecutor ExecutorService的默認(rèn)實(shí)現(xiàn)
ScheduledThreadPoolExecutor 繼承ThreadPoolExecutor的ScheduledExecutorService接口實(shí)現(xiàn),周期性任務(wù)調(diào)度的類實(shí)現(xiàn)

Executors

newSingleThreadExecutor

創(chuàng)建一個(gè)單線程的線程池。這個(gè)線程池只有一個(gè)線程在工作,也就是相當(dāng)于單線程串行執(zhí)行所有任務(wù)。如果這個(gè)唯一的線程因?yàn)楫惓=Y(jié)束,那么會(huì)有一個(gè)新的線程來替代它。此線程池保證所有任務(wù)的執(zhí)行順序按照任務(wù)的提交順序執(zhí)行。

newFixedThreadPool

創(chuàng)建固定大小的線程池。每次提交一個(gè)任務(wù)就創(chuàng)建一個(gè)線程,直到線程達(dá)到線程池的最大大小。線程池的大小一旦達(dá)到最大值就會(huì)保持不變,如果某個(gè)線程因?yàn)閳?zhí)行異常而結(jié)束,那么線程池會(huì)補(bǔ)充一個(gè)新線程。

newCachedThreadPool

創(chuàng)建一個(gè)可緩存的線程池。如果線程池的大小超過了處理任務(wù)所需要的線程,
那么就會(huì)回收部分空閑(60秒不執(zhí)行任務(wù))的線程,當(dāng)任務(wù)數(shù)增加時(shí),此線程池又可以智能的添加新線程來處理任務(wù)。此線程池不會(huì)對(duì)線程池大小做限制,線程池大小完全依賴于操作系統(tǒng)(或者說JVM)能夠創(chuàng)建的最大線程大小。

newScheduledThreadPool

創(chuàng)建一個(gè)大小無限的線程池。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。

線程安全

線程安全是一個(gè)很大的問題,Java 最常見的 HttpServlet 就是單實(shí)例多線程,解決這樣的問題,有多種方式:

ThreadLocal

ThreadLocal 看下一節(jié)的內(nèi)存圖就很好理解,每個(gè)線程都有自己的工作內(nèi)存,ThreadLocal 就是將變量存到線程自己的工作內(nèi)存中,所以不會(huì)有并發(fā)問題。

Synchronized
synchronized鎖住的是括號(hào)里的對(duì)象,而不是代碼。對(duì)于非 staticsynchronized 方法,鎖的就是對(duì)象本身也就是 this 。該關(guān)鍵字可以加到:

實(shí)例方法

靜態(tài)方法

實(shí)例方法中的同步塊

靜態(tài)方法中的同步塊

ReentrantLock / Condition
synchronized 不夠靈活,例如讀寫文件,讀和讀之間不應(yīng)該互斥,這個(gè)時(shí)候就可以使用 ReentrantLock 增加并發(fā)能力。Condition 是綁定到 Lock 上的,可以用于線程間通信,例如這個(gè)面試題,就可以使用 Condition 喚起線程寫自己的 name

有四個(gè)線程1、2、3、4。線程1的功能就是輸出1,線程2的功能就是輸出2,以此類推.........現(xiàn)在有四個(gè)文件ABCD。初始都為空。現(xiàn)要讓四個(gè)文件呈如下格式:A:1 2 3 4 1 2.... B:2 3 4 1 2 3.... C:3 4 1 2 3 4.... D:4 1 2 3 4 1....

并發(fā)容器
常見的 ConcurrentHashMap CopyOnWriteArrayList 用于多線程下存放數(shù)據(jù),Queue BlockingQueue 用于排隊(duì)消費(fèi)。

Atomic 包
在 Atomic 包里一共有 12 個(gè)類,四種原子更新方式,分別是原子更新基本類型,原子更新數(shù)組,原子更新引用和原子更新字段。某些并發(fā)問題,需要無鎖解決時(shí),就可以考慮使用原子方法。

返回目錄

內(nèi)存模型

Java內(nèi)存模型規(guī)定,對(duì)于多個(gè)線程共享的變量,存儲(chǔ)在主內(nèi)存當(dāng)中,每個(gè)線程都有自己獨(dú)立的工作內(nèi)存,線程只能訪問自己的工作內(nèi)存,不可以訪問其它線程的 工作內(nèi)存。工作內(nèi)存中保存了主內(nèi)存共享變量的副本,線程要操作這些共享變量,只能通過操作工作內(nèi)存中的副本來實(shí)現(xiàn),操作完畢之后再同步回到主內(nèi)存當(dāng)中。

如何保證多個(gè)線程操作主內(nèi)存的數(shù)據(jù)完整性是一個(gè)難題,Java內(nèi)存模型也規(guī)定了工作內(nèi)存與主內(nèi)存之間交互的協(xié)議,首先是定義了8種原子操作:

lock:將主內(nèi)存中的變量鎖定,為一個(gè)線程所獨(dú)占

unclock:將lock加的鎖定解除,此時(shí)其它的線程可以有機(jī)會(huì)訪問此變量

read:將主內(nèi)存中的變量值讀到工作內(nèi)存當(dāng)中

load:將read讀取的值保存到工作內(nèi)存中的變量副本中。

use:將值傳遞給線程的代碼執(zhí)行引擎

assign:將執(zhí)行引擎處理返回的值重新賦值給變量副本

store:將變量副本的值存儲(chǔ)到主內(nèi)存中。

write:將store存儲(chǔ)的值寫入到主內(nèi)存的共享變量當(dāng)中。

內(nèi)存組成

堆(Heap)

運(yùn)行時(shí)數(shù)據(jù)區(qū)域,所有類實(shí)例和數(shù)組的內(nèi)存均從此處分配。Java虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。對(duì)象的堆內(nèi)存由稱為垃圾回收器 的自動(dòng)內(nèi)存管理系統(tǒng)回收。

News Generation(Young Generation即圖中的Eden + From Space + To Space)

Eden 存放新生的對(duì)象

Survivor Space 兩個(gè) 存放每次垃圾回收后存活的對(duì)象

Old Generation(Tenured Generation 即圖中的Old Space) 主要存放應(yīng)用程序中生命周期長的存活對(duì)象

非堆內(nèi)存

JVM具有一個(gè)由所有線程共享的方法區(qū)。方法區(qū)屬于非堆內(nèi)存。它存儲(chǔ)每個(gè)類結(jié)構(gòu),如運(yùn)行時(shí)常數(shù)池、字段和方法數(shù)據(jù),以及方法和構(gòu)造方法的代碼。它是在Java虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建的。
除了方法區(qū)外,Java虛擬機(jī)實(shí)現(xiàn)可能需要用于內(nèi)部處理或優(yōu)化的內(nèi)存,這種內(nèi)存也是非堆內(nèi)存。例如,JIT編譯器需要內(nèi)存來存儲(chǔ)從Java虛擬機(jī)代碼轉(zhuǎn)換而來的本機(jī)代碼,從而獲得高性能。

Permanent Generation? (圖中的Permanent Space)存放JVM自己的反射對(duì)象,比如類對(duì)象和方法對(duì)象

native heap

返回目錄

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/66130.html

相關(guān)文章

  • 七夕秀恩愛新姿勢(shì)!這波操作給十分!

    摘要:四結(jié)語七夕已至,快和親愛的人綁定最美戀愛關(guān)系吧在這里,你們就是導(dǎo)演,記錄美好愛情。特別說明此小程序,是我親手為女朋友寫的,感謝她提供需求支持,七夕快樂。 showImg(https://segmentfault.com/img/remote/1460000020001501?w=779&h=203); 一、前言 像每一滴酒回不了最初的葡萄,我回不到年少。愛情亦是如此,這就是寫一篇小程序...

    imingyu 評(píng)論0 收藏0
  • 前端周刊第62期:學(xué)習(xí)學(xué)習(xí)再學(xué)習(xí)

    摘要:騰訊前端技術(shù)大會(huì)和全球技術(shù)領(lǐng)導(dǎo)力峰會(huì)都于上周閉幕,我翻看了下講稿,有價(jià)值的參考還是不少。騰訊前端大會(huì)下載騰訊前端大會(huì)是由騰訊主辦,廣邀國內(nèi)外的前端大牛,有著名流行框架的作者知名前端書籍的作者工程化方面的權(quán)威等。 showImg(https://segmentfault.com/img/bVQk0r?w=757&h=427); 共 2462 字,讀完需 4 分鐘。騰訊前端技術(shù)大會(huì)(TFC...

    tinylcy 評(píng)論0 收藏0
  • 超越“虛擬美麗”——云計(jì)算實(shí)踐再分析

    摘要:云計(jì)算在年月達(dá)到了較高的點(diǎn)擊率次。而大數(shù)據(jù)正處于上升期,云計(jì)算正處于興旺期,網(wǎng)格計(jì)算沒有再出現(xiàn)。所以,我們第四屆中國云計(jì)算大會(huì)就是以示范引領(lǐng)創(chuàng)新實(shí)踐作為一個(gè)口號(hào)。就是說云計(jì)算已經(jīng)成為行業(yè)的主旋律,不再動(dòng)搖不再懷疑。 云計(jì)算正在走向成熟,大數(shù)據(jù)正在發(fā)展 在經(jīng)歷了對(duì)云計(jì)算的認(rèn)識(shí)以后,已經(jīng)成為當(dāng)前信息通信行業(yè)的主旋律。我們可以用維基百科看一看當(dāng)前對(duì)三個(gè)重要技術(shù)概念的理解。一個(gè)是曾經(jīng)人們跟云計(jì)算混...

    tulayang 評(píng)論0 收藏0
  • 紀(jì)念 Vamei

    摘要:相關(guān)文章一席演講沒有殺死我的朋友紀(jì)念朋友紀(jì)念技術(shù)圈紀(jì)念技術(shù)圈紀(jì)念除馴豬圖,其它照片皆所攝,取自豆瓣 偶然在某公眾號(hào)里看到一篇文章,得知 Vamei 去世的消息。 看到它之前,我并不知道這位知名的 Python 技術(shù)博主。我寫 Python 技術(shù)文章有一小段時(shí)間了,也認(rèn)識(shí)了很多圈內(nèi)的博主。但是,這個(gè) Vamei 是誰呢?竟不認(rèn)識(shí)。我很好奇。 因?yàn)橄⑹菑亩拱昀飩鞒鰜淼模揖腿ニ阉亩拱辍?..

    goji 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<