Java高並發之同步異步
阿新 • • 發佈:2019-01-10
sync tps gif rri tle pen 分享 alt sed
1、概念理解:
2、同步的解決方案:
1).基於代碼
synchronized 關鍵字
修飾普通方法:作用於當前實例加鎖,進入同步代碼前要獲得當前實例的鎖。
修飾靜態方法:作用於當前類對象加鎖,進入同步代碼前要獲得當前類對象的鎖。
修飾代碼塊:指定加鎖對象,對給定對象加鎖,進入同步代碼塊前要獲得給定對象的鎖。
code1
package com.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 同步方法 * @author Administrator *View Code*/ public class SynchronizedMethod implements Runnable{ //靜態共享變量 i static int i = 0; /** * 自增 */ public synchronized void increase(){ i++; } @Override public void run() { for (int j = 0; j < 100; j++) { increase(); } }public static void main(String[] args) throws InterruptedException { SynchronizedMethod instance = new SynchronizedMethod(); ExecutorService executorService = Executors.newFixedThreadPool(2); for (int i = 0; i < 3; i++) { //同一實例,線程共享靜態變量i // executorService.execute(instance);//不同實例,線程單獨享有變量i,達不到同步目的 executorService.execute(new SynchronizedMethod()); /** * 由於線程執行時間過短,在不同實例下,可能會得到類似於同步的結果。 */ Thread.sleep(100); } executorService.shutdown(); System.out.println(i); //300 } }
code2
package com.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 同步代碼塊 * @author Administrator * */ public class SynchronizedCodeBlock implements Runnable{ //靜態共享變量 i static int i = 0; @Override public void run() { //同步進來的對象 synchronized(this){ //SynchronizedCodeBlock.class for (int j = 0; j < 100; j++) { i++; } } } public static void main(String[] args) throws InterruptedException { SynchronizedCodeBlock instance = new SynchronizedCodeBlock(); ExecutorService executorService = Executors.newFixedThreadPool(2); for (int i = 0; i < 3; i++) { // executorService.execute(instance); executorService.execute(new SynchronizedCodeBlock()); Thread.sleep(10); } executorService.shutdown(); System.out.println(i); //300 } }View Code
參考博客:
https://blog.csdn.net/javazejian/article/details/72828483
2).基於數據庫
Java高並發之同步異步