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

