1. 程式人生 > >Java高並發之同步異步

Java高並發之同步異步

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
 *
 
*/ 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 } }
View Code

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高並發之同步異步