Java synchronize線程安全測試
線程的運行是與當前CPU的資源調度與時間片是有關系的,當一個線程中的執行到某一部分方法的時候輪到另外一個線程來執行相應的代碼,所以還沒有等到第一個線程執行完那么CPU有切換到另外一個線程來運行其相應的代碼,所以這個時候假如操作公共的數據部分就會出現錯誤
為了解決這個問題,可以使用 synchronized 同步代碼塊來對公共部分進行同步操作
在用synchronize關鍵字修飾同步代碼塊時,運行代碼發現不能交替賣票。 以下是初始代碼
package com.itheima.Test;public class Test1a { public static void main(String[] args) { Ticket1a t1=new Ticket1a(); new Thread(t1,'A').start(); new Thread(t1,'B').start(); new Thread(t1,'C').start(); }}class Ticket1a implements Runnable{ int ticket=100; @Override public void run() { synchronized (Ticket1a.class) { while (true) { if (ticket<=0) {break; } try {Thread.sleep(20); } catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace(); }System.out.println(Thread.currentThread().getName()+' sold '+(ticket--)); } } }}
運行結果:
A sold 100A sold 99A sold 98A sold 97A sold 96A sold 95A sold 94A sold 93A sold 92A sold 91...A sold 10A sold 9A sold 8A sold 7A sold 6A sold 5A sold 4A sold 3A sold 2A sold 1
雖然解決了線程的安全問題,但是不能實現三個窗口交替賣票。后來仔細一看,是synchronize關鍵字修飾的代碼塊位置不對,相當于修飾了同步方法。
更改后:
@Override public void run() { while (true) {synchronized (Ticket1a.class) { if (ticket<=0) {break; } try {Thread.sleep(20); } catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace(); }System.out.println(Thread.currentThread().getName()+' sold '+(ticket--)); } } }
這樣就完成了線程安全的小測試。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。
相關文章:
1. 怎樣才能用js生成xmldom對象,并且在firefox中也實現xml數據島?2. 基于javaweb+jsp實現企業車輛管理系統3. 利用ajax+php實現商品價格計算4. ASP.Net MVC利用NPOI導入導出Excel的示例代碼5. jstl 字符串處理函數6. JSP動態網頁開發原理詳解7. PHP中為什么使用file_get_contents("php://input")接收微信通知8. .Net core Blazor+自定義日志提供器實現實時日志查看器的原理解析9. IOS蘋果AppStore內購付款的服務器端php驗證方法(使用thinkphp)10. XML CDATA是什么?
