更新時間:2022-06-10 09:24:00 來源:動力節點 瀏覽1272次
Java中實現線程同步的方法有哪些?動力節點小編來告訴大家。
也就是有修改同步關鍵字的方法。因為java中的每個對象都有一個內置鎖,當你用這個關鍵字修改一個方法時,內置鎖保護了整個方法。在調用方法之前,需要先獲取內置鎖,否則會處于阻塞狀態。。
注意:Java多線程同步synchronized關鍵字也可以修改靜態方法,如果調用靜態方法,會鎖定整個類。
也就是被synchronized關鍵字修改的語句塊。被這個關鍵字修改的語句塊被自動鎖定,實現同步。
代碼如下:
synchronized(object){
}
注意:同步是一項開銷很大的操作,所以要盡量減少同步的內容。。一般不需要同步整個方法,使用同步的代碼塊可以同步關鍵代碼。
package com.xhj.thread;
/**
* application of thread synchronization
*
* @author XIEHEJUN
*
*/
public class SynchronizedThread {
class Bank {
private int account = 100;
public int getAccount() {
return account;
}
/**
* realized by synchronous method
*
* @param money
*/
public synchronized void save(int money) {
account += money;
}
/**
* implement with synchronous code block
*
* @param money
*/
public void save1(int money) {
synchronized (this) {
account += money;
}
}
}
class NewThread implements Runnable {
private Bank bank;
public NewThread(Bank bank) {
this.bank = bank;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
// bank.save1(10);
bank.save(10);
System.out.println(i + " the account balance is :" + bank.getAccount());
}
}
}
/**
* set up a thread and call the inner class
*/
public void useThread() {
Bank bank = new Bank();
NewThread new_thread = new NewThread(bank);
System.out.println(" thread 1 ");
Thread thread1 = new Thread(new_thread);
thread1.start();
System.out.println(" thread 2 ");
Thread thread2 = new Thread(new_thread);
thread2.start();
}
public static void main(String[] args) {
SynchronizedThread st = new SynchronizedThread();
st.useThread();
}
}
例子加說明:
同步是多線程中的一個重要概念。在多線程環境中可以保證使用同步。,程序不會在設計之外產生錯誤結果。實現同步有兩種方式。, 同步方法和同步塊,都使用了synchronized關鍵字。
同步方法:在方法中添加同步修飾符,使其成為同步方法,該方法可以是靜態的和非靜態的,但不能是抽象類的抽象方法,也不能是接口中的接口方法。
(1)java.util.concurrent
(2)synchronized同步的
(3)ReentrantLockfinally
線程本地
ThreadLocal() : get() : initialValue() : "" set(T value) : value
//Bank
public class Bank{
//ThreadLocalaccount
private static ThreadLocal<Integer> account = new ThreadLocal<Integer>(){
@Override
protected Integer initialValue(){
return 100;
}
};
public void save(int money){
account.set(account.get()+money);
}
public int getAccount(){
return account.get();
}
}
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習