Java多線程下解決數(shù)據(jù)安全問題
同步代碼塊
基本語句
synchronized (任意對象) {
操作共享代碼
}
代碼示例
public class SellTicket implements Runnable { private int tickets = 100; private Object object = new Object(); @Override public void run() { while (true) { synchronized (object) { if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "張票"); tickets--; } } } } public static void main(String[] args) { SellTicket sellTicket = new SellTicket(); Thread thread1 = new Thread(sellTicket, "窗口1"); Thread thread2 = new Thread(sellTicket, "窗口2"); Thread thread3 = new Thread(sellTicket, "窗口3"); thread1.start(); thread2.start(); thread3.start(); } }
優(yōu)缺點:
- 解決了多線程的數(shù)據(jù)安全問題
- 多線程時,每個線程都會判斷同步上的鎖,耗費資源,降低了程序的運行效率
同步方法
同步方法:將synchronized關(guān)鍵字加到方法上
- 格式: 修飾符 synchronized 返回值類型 方法名(){ }
- 同步方法的鎖對象是this
同步靜態(tài)方法,就是把synchronized關(guān)鍵字加到靜態(tài)方法上
- 格式: 修飾符 static synchronized 返回值類型 方法名(){ }
- 同步靜態(tài)方法的鎖對象是 類名.class
代碼示例
public class SellTicket implements Runnable { // private int tickets = 100; private static int tickets = 100; private Object object = new Object(); private int x = 0; @Override public void run() { while (true) { if (x % 2 == 0) { // synchronized (object) { // synchronized (this) { synchronized (SellTicket.class) { if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "張票"); tickets--; } } } else { // synchronized (object) { // if (tickets > 0) { // try { // Thread.sleep(100); // } catch (InterruptedException e) { // e.printStackTrace(); // } // System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "張票"); // tickets--; // } // } sellTicket(); } x++; } } // private void sellTicket(){ // synchronized (object) { // if (tickets > 0) { // try { // Thread.sleep(100); // } catch (InterruptedException e) { // e.printStackTrace(); // } // System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "張票"); // tickets--; // } // } // } // private synchronized void sellTicket(){ // if (tickets > 0) { // try { // Thread.sleep(100); // } catch (InterruptedException e) { // e.printStackTrace(); // } // System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "張票"); // tickets--; // } private static synchronized void sellTicket(){ if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "張票"); tickets--; } } public static void main(String[] args) { SellTicket sellTicket = new SellTicket(); Thread thread1 = new Thread(sellTicket, "窗口1"); Thread thread2 = new Thread(sellTicket, "窗口2"); Thread thread3 = new Thread(sellTicket, "窗口3"); thread1.start(); thread2.start(); thread3.start(); } }
lock鎖
lock實現(xiàn)提供比使用synchronized方法和語句可獲得更廣泛的操作
- void lock()獲得鎖
- void unlock()釋放
lock是接口不能直接實例化,采用實現(xiàn)類實例化ReentrantLock
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class SellTicket implements Runnable { private int tickets = 100; private Object object = new Object(); private Lock lock = new ReentrantLock(); @Override public void run() { while (true) { try { lock.lock(); if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "張票"); tickets--; } } finally { lock.unlock(); } } } public static void main(String[] args) { SellTicket sellTicket = new SellTicket(); Thread thread1 = new Thread(sellTicket, "窗口1"); Thread thread2 = new Thread(sellTicket, "窗口2"); Thread thread3 = new Thread(sellTicket, "窗口3"); thread1.start(); thread2.start(); thread3.start(); }
到此這篇關(guān)于Java多線程下解決數(shù)據(jù)安全問題的文章就介紹到這了,更多相關(guān)java多線程數(shù)據(jù)安全內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
聊聊SpringBoot使用Nacos進(jìn)行服務(wù)注冊發(fā)現(xiàn)與配置管理問題
Nacos支持基于DNS和基于RPC的服務(wù)發(fā)現(xiàn)(可以作為springcloud的注冊中心)、動態(tài)配置服務(wù)(可以做配置中心)、動態(tài)?DNS?服務(wù)。本文重點給大家介紹SpringBoot使用Nacos進(jìn)行服務(wù)注冊發(fā)現(xiàn)與配置管理,感興趣的朋友一起看看吧2022-01-01Spring實戰(zhàn)之使用Expression接口進(jìn)行表達(dá)式求值操作示例
這篇文章主要介紹了Spring實戰(zhàn)之使用Expression接口進(jìn)行表達(dá)式求值操作,結(jié)合實例形式分析了Spring操作Expression接口實現(xiàn)表達(dá)式運算的操作技巧與相關(guān)注意事項,需要的朋友可以參考下2019-12-12關(guān)于idea更新到2020.2.3無法創(chuàng)建web項目原因 library is not specified
這篇文章主要介紹了關(guān)于idea更新到2020.2.3無法創(chuàng)建web項目原因 library is not specified,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10解決Spring?Security集成knife4j訪問接口文檔出現(xiàn)403的問題
這篇文章主要給大家介紹了如何解決Spring?Security集成knife4j訪問接口文檔出現(xiàn)403的問題,文中有詳細(xì)的解決方案,有需要的朋友可以參考閱讀下2023-07-07