本篇內容主要講解“java兩個線程對變量進行加1操作實例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java兩個線程對變量進行加1操作實例分析”吧!
創新互聯公司堅持“要么做到,要么別承諾”的工作理念,服務領域包括:網站建設、網站設計、企業官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的永興網站設計、移動媒體設計的需求,幫助企業找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!
1--錯誤的常規寫法
public static int i=0;
public static void add(){
i=i+1;
action();
}
public static void action(){
System.out.println("==>"+Thread.currentThread().getName()+":"+i);
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(SysUserServiceImpl::add,"t1");
Thread t2= new Thread(SysUserServiceImpl::add,"t2");
t1.start();
t2.start();
}
運行結果==>
==>t1:1
==>t2:2
==>t1:2
==>t2:1
==>t1:2
==>t2:2
每次運行結果不一致,多線程環境下,t1對共享內存中的i進行+1操作,但未將值刷新到主內存,此時恰好t2也對i取到還是0進行+1操作,使得最后結果i都為1,同理t1處理完為1,t2處理完為2。多次運行結果都不一致。
改進方法1 --同步鎖
public class ThreadException {
public static volatile int i=0;
public static void add(){
synchronized (ThreadException.class){
i=i+1;
action();
}
}
public static void action(){
System.out.println("==>"+Thread.currentThread().getName()+":"+i);
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(ThreadException::add,"t1");
Thread t2= new Thread(ThreadException::add,"t2");
t1.start();
t2.start();
}
}
優點:實現簡單
缺點:加鎖粒度大,性能低下,分布式環境,多JVM條件,synchronized失效,synchronized 只是本地鎖,鎖的也只是當前jvm下的對象,在分布式場景下,要用分布式鎖
改進方法2 AtomicInteger
public class ThreadException { private static AtomicInteger num = new AtomicInteger(0); public static void add(){ int i = num.getAndIncrement(); action(i); } public static void action(int i){ System.out.println("由"+i+"==>"+Thread.currentThread().getName()+":"+num); } public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(ThreadException::add,"t1"); Thread t2= new Thread(ThreadException::add,"t2"); t1.start(); t2.start(); }}
改進方法3 lock
public class ThreadException {
public static volatile int i=0;
public static void action(){
System.out.println("==>"+Thread.currentThread().getName()+":"+i);
}
static Lock lock=new ReentrantLock();
public static void inc() {
lock.lock();
try {
Thread.sleep(1);
i=i+1;
action();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(ThreadException::inc,"t1");
Thread t2= new Thread(ThreadException::inc,"t2");
t1.start();
t2.start();
}
}
分布式鎖:保證多個節點同步執行
實現方案:1。基于數據庫,2.基于redis緩存,3.基于zookeeper
到此,相信大家對“java兩個線程對變量進行加1操作實例分析”有了更深的了解,不妨來實際操作一番吧!這里是創新互聯網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
當前名稱:java兩個線程對變量進行加1操作實例分析
標題URL:http://m.kartarina.com/article10/piphdo.html
成都網站建設公司_創新互聯,為您提供網站制作、企業建站、網站收錄、網站策劃、、網站內鏈
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯