Java synchronize線程安全測(cè)試
線程的運(yùn)行是與當(dāng)前CPU的資源調(diào)度與時(shí)間片是有關(guān)系的,當(dāng)一個(gè)線程中的執(zhí)行到某一部分方法的時(shí)候輪到另外一個(gè)線程來執(zhí)行相應(yīng)的代碼,所以還沒有等到第一個(gè)線程執(zhí)行完那么CPU有切換到另外一個(gè)線程來運(yùn)行其相應(yīng)的代碼,所以這個(gè)時(shí)候假如操作公共的數(shù)據(jù)部分就會(huì)出現(xiàn)錯(cuò)誤
為了解決這個(gè)問題,可以使用 synchronized 同步代碼塊來對(duì)公共部分進(jìn)行同步操作
在用synchronize關(guān)鍵字修飾同步代碼塊時(shí),運(yùn)行代碼發(fā)現(xiàn)不能交替賣票。 以下是初始代碼
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 block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" sold "+(ticket--)); } } } }
運(yùn)行結(jié)果:
A sold 100 A sold 99 A sold 98 A sold 97 A sold 96 A sold 95 A sold 94 A sold 93 A sold 92 A sold 91 . . . A sold 10 A sold 9 A sold 8 A sold 7 A sold 6 A sold 5 A sold 4 A sold 3 A sold 2 A sold 1
雖然解決了線程的安全問題,但是不能實(shí)現(xiàn)三個(gè)窗口交替賣票。后來仔細(xì)一看,是synchronize關(guān)鍵字修飾的代碼塊位置不對(duì),相當(dāng)于修飾了同步方法。
更改后:
@Override public void run() { while (true) { synchronized (Ticket1a.class) { if (ticket<=0) { break; } try { Thread.sleep(20); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" sold "+(ticket--)); } } }
這樣就完成了線程安全的小測(cè)試。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java生成二維碼的兩種實(shí)現(xiàn)方式(基于Spring?Boot)
這篇文章主要給大家介紹了關(guān)于Java生成二維碼的兩種實(shí)現(xiàn)方式,文中的代碼基于Spring?Boot,本文基于JAVA環(huán)境,以SpringBoot框架為基礎(chǔ)開發(fā),文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07SpringBoot管理RabbitMQ中的Channel詳解
這篇文章主要介紹了SpringBoot管理RabbitMQ中的Channel詳解,channel僅存在于connection的上下文中,而不會(huì)單獨(dú)存在,當(dāng)channel關(guān)閉時(shí),其上的所有channel也會(huì)關(guān)閉,需要的朋友可以參考下2023-08-08Java并發(fā)工具之Exchanger線程間交換數(shù)據(jù)詳解
這篇文章主要介紹了Java并發(fā)工具之Exchanger線程間交換數(shù)據(jù)詳解,Exchanger是一個(gè)用于線程間協(xié)作的工具類,Exchanger用于進(jìn)行線程間的數(shù)據(jù)交 換,它提供一個(gè)同步點(diǎn),在這個(gè)同步點(diǎn),兩個(gè)線程可以交換彼此的數(shù)據(jù),需要的朋友可以參考下2023-12-12Java程序圖形用戶界面設(shè)計(jì)之標(biāo)簽組件
圖形界面(簡(jiǎn)稱GUI)是指采用圖形方式顯示的計(jì)算機(jī)操作用戶界面。與早期計(jì)算機(jī)使用的命令行界面相比,圖形界面對(duì)于用戶來說在視覺上更易于接受,本篇精講Java語(yǔ)言中關(guān)于圖形用戶界面的標(biāo)簽組件部分2022-02-02springboot結(jié)合mybatis-plus基于session模擬短信注冊(cè)功能
本文主要介紹了springboot結(jié)合mybatis-plus基于session模擬短信注冊(cè)功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11