Java技術整理 Part2

[color=red]解釋 native,strictfp,transient,volatile:[/color]
ref:[url]http://www.iteye.com/topic/82640[/url]
- transient
變量修飾符。標記為transient的變量,在對象存儲時,這些變量狀態不會被持久化。當對象序列化的保存在存儲器上時,不希望有些字段數據被保存,為了保證安全性,可以把這些字段聲明為transient。
- volatile
volatile修飾變量。在每次被線程訪問時,都強迫從共享內存中重讀該成員變量的值。而且,當成員變量發生變化時,強迫線程將變化值回寫到共享內存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。
看看Java Language Specification中的例子。
條件:一個線程不停的調用方法one(),一個線程不停的調用方法two()。我測試過多次,這種情況好像一直沒有出現。
class Test {
static int i = 0, j = 0;
static void one() { i++; j++; }
static void two() {
System.out.println("i=" + i + " j=" + j);
}
}

結果偶爾會出現j大於i的情況,因為方法沒有同步,所以會出現i和j可能不是一次更新。一種防止這種情況發生的辦法就是聲明兩個方法為synchronized 的。
class Test {
static int i = 0, j = 0;
static synchronized void one() { i++; j++; }
static synchronized void two() {
System.out.println("i=" + i + " j=" + j);
}
}

這樣可以防止兩個方法同時被執行,還可以保證j和i被同時更新,這樣一來i和j的值一直是一樣的。另外一種途徑就是把i和j聲明為volatile。
class Test {
static volatile int i = 0, j = 0;
static void one() { i++; j++; }
static void two() {
System.out.println("i=" + i + " j=" + j);
}
}


[color=red]volatile的另一種解釋[/color]:
volatile 為一關鍵字 加在變數的前面
被 volatile 宣告的變數 將不會使用最佳化編譯
有時一個變數的值改變了 compiler 並不會馬上將他寫入記憶體中
而會先把結果放在CPU暫存器中 等到處理結束之後 才寫入記憶體
若說這個變數是多執行緒的flag 其他的執行緒要透過這個變數來反應
而這個值卻又沒有寫入記憶體 這時便會發生意想不到的結果
又或者是這變數為一個硬體的暫存器 會被硬體所改變
然而compiler 並沒有正確的將值從硬體暫存器取出來
而是將自己暫存的值拿來使用
這種情況 就是要用volatile 來宣告變數 告訴compiler不要自己暫存變數來提升速度
如此這個變數有任何的改變 便會馬上反應出來

[color=red]JIT 和HotSpot 有何不同?[/color]
JIT 是完全編譯,不做任何選擇全部做最佳化。
HotSpot 則是分析bytecode,找出時常重覆執行的”HotSpot”,只將這部份轉成機器碼。

[color=red]HotSpot的另外一個解釋:[/color]
改進JVM效能的技術之一,JAVA原始程式碼被編譯成bytecode後HotSpot探查程式執行時效率影響較大的程式碼片段,後對bytecode中這些片段動態編譯成原生碼,又對這些原生碼進行最佳化,從而提高執行效率。

[color=red]Object Serialization:[/color]
1.Serializable介面中沒有定義任何方法(Method),其實它是一個Marker Interface,它只是告訴JVM此物件可以被序列化!!
2.[url]http://zzy1943.iteye.com/blog/634418[/url]

[color=red]Generics:[/color]
泛型(Generics)
[url]http://caterpillar.onlyfun.net/Gossip/JavaGossip-V1/JavaGossip.htm[/url]
簡單摘要一下...
為了達到"泛型"的功能,在一開始的時候,有一種作法是使用Object:
public class ObjectFoo {
private Object foo;

public void setFoo(Object foo) {
this.foo = foo;
}

public Object getFoo() {
return foo;
}
}


然後通過以下方法操作:

ObjectFoo foo1 = new ObjectFoo();
foo1.setFoo(new Boolean(true));
// 記得轉換介面
Boolean b = (Boolean) foo1.getFoo();

但是,有時候粗心大意,寫成...,造成錯誤...

ObjectFoo foo1 = new ObjectFoo();
foo1.setFoo(new Boolean(true));
[color=darkred]String s = (String) foo1.getFoo();[/color]

要命的是,語法上是可以的,所以編譯器檢查不出錯誤,真正的錯誤要在執行時期才會發生(ClassCastException)。所以這種設計不保險。

於是,我們換個寫法...

public class GenericFoo<T> {
private T foo;

public void setFoo(T foo) {
this.foo = foo;
}

public T getFoo() {
return foo;
}
}

而使用下面方法操作:

GenericFoo<Boolean> foo1 = new GenericFoo<Boolean>();

foo1.setFoo(new Boolean(true));
Boolean b = foo1.getFoo();


而這一次,如果我們誤寫錯了,在compile期間就會偵測出錯誤!
GenericFoo<Boolean> foo1 = new GenericFoo<Boolean>();

foo1.setFoo(new Boolean(true));
Integer b = foo1.getFoo();


[color=darkred]P/s:如果使用泛型類別,但宣告時不一併指定型態呢?那麼預設會使用Object,不過您就要自己轉換物件的介面型態了,但編譯器會提出警訊,告訴您這可能是不安全的操作[/color]

[color=red]JSP Bean scope:[/color]
Page:
[color=gray]載入的JavaBean其有效範圍只能夠在載入的那份JSP網頁中使用,當一離開這份JSP網頁,JavaBean隨即無效。[/color]
Session:
[color=gray]所載入的JavaBean的生命週期是起始於JavaBean的載入至使用者的Session失效為止,且不同的Session並不能互相使用所載入的JavaBean。[/color]
Application:
[color=gray]所載入的JavaBean其生命週期是起使於所載入的網頁至伺服器關閉,且JavaBean為公開的,任何一個JSP網頁皆能夠使用,且在任何JSP網頁中所載入的JavaBean是可以互相的使用,互相存取。[/color]
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值