共享性
多線程操作同一個數據,產生線程安全問題
新建一個類ShareData
設計一個int 型的成員變量count
設計一個成員方法addCount(),把count變量++
在main函數中開啟多個線程操作這個成員變量,在main函數里
獲取ShareData對象,new 出來
?
使用for循環10次,在循環中開啟線程,模擬10個線程并發,在循環內
獲取Thread對象,new出來,構造函數參數:Runable對象
匿名內部類實現Runable接口,重寫run()方法
調用Thread.sleep(1000),使線程睡眠一秒,增加出現問題的概率
使用for循環100次,調用addCount()方法
?
調用Thread.sleep(3),主程序睡眠3秒,保證上面的線程全部執行完了
打印count變量
?
調用Thread對象的start()方法
package com.tsh.mthread;public class Home {public int count;public static void main(String[] args) {final Home home = new Home();for (int i = 0; i < 10; i++) {Thread t = new Thread(new Runnable() {@Overridepublic void run() {for (int j = 0; j < 100; j++) {home.addCount();}try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}System.out.println(Thread.currentThread()+":"+home.count);}});t.start();}// 睡三秒等等上面的try {Thread.sleep(3000);} catch (Exception e) {e.printStackTrace();}System.out.println("總計:" + home.count);}public void addCount() {count++;} }
?
互斥性
使用synchronized關鍵字修飾上面的addCount()方法,當前線程操作時加把鎖,同時只允許一個訪問者對資源進行訪問,具有唯一性和排他性
public synchronized void addCount() {count++;}
?
使用synchronized修飾代碼塊
public void addCount() {synchronized (this) {count++;}}
?