同步塊性能優(yōu)化的代碼
/*
?* 線程安全:在并發(fā)時(shí)保證數(shù)據(jù)的正確性,同時(shí)保證效率盡可能高
?* synchronized
?* 1.同步方法(在方法上面加synchronized)
?* 2.同步塊
?*/
public class SynBlockTest03 {
?? ?public static void main(String[] args) {
?? ??? ?//一份資源
?? ??? ?SynWeb12306? web=new SynWeb12306();
?? ??? ??? ??? ?//多個(gè)代理
?? ??? ??? ??? ?new Thread(web,"laoda").start();
?? ??? ??? ??? ?new Thread(web,"laoer").start();
?? ??? ??? ??? ?new Thread(web,"laosan").start();
?? ?}
}
class SynWeb12306 implements Runnable{
?? ?//票數(shù)
?? ?private int ticketNums=3;
?? ?private boolean flag=true;
?? ?@Override
?? ?public void run() {
?? ??? ?while(flag) {
?? ??? ??? ?test5();
?? ??? ?}
?? ??? ?
?? ?}
?? ?//線程安全:盡可能鎖定合理的范圍(不是指的代碼而是數(shù)據(jù)的完整性)
?? ?//在多線程里面稱為雙重檢測(主要考慮的就是臨界值的問題)
?? ?public? void test5() {
?? ??? ?//假設(shè)還有一張票,多個(gè)線程進(jìn)來,這一塊的代碼攔不住
?? ??? ?if(ticketNums<=0) {//考慮的是沒有票的情況???? ?
?? ??? ??? ?flag=false;
?? ??? ??? ?return;
?? ??? ?}
?? ??? ?synchronized (this) {
?? ??? ??? ?if(ticketNums<0) {//考慮的是最后一張票??? ?
?? ??? ??? ??? ?flag=false;
?? ??? ??? ??? ?return;
?? ??? ??? ?}
?? ??? ??? ?//模擬網(wǎng)絡(luò)延時(shí)
?? ??? ??? ?try {
?? ??? ??? ??? ?Thread.sleep(200); ?
?? ??? ??? ??? ?//進(jìn)入了阻塞狀態(tài),然后200s以后我就重新等待CPU的調(diào)用
?? ??? ??? ??? ?//繼續(xù)執(zhí)行下面的代碼
?? ??? ??? ?} catch (InterruptedException e) {
?? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ?}
?? ??? ??? ?System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);
?? ??? ?}
?? ??? ?
?? ?}
?? ?//線程不安全?? 范圍太小鎖不住
?? ?public? void test4() {
?? ??? ?synchronized (this) {
?? ??? ??? ?if(ticketNums<0) {
?? ??? ??? ??? ?flag=false;
?? ??? ??? ??? ?return;
?? ??? ??? ?}
?? ??? ?}
?? ??? ??? ?//模擬網(wǎng)絡(luò)延時(shí)
?? ??? ??? ?try {
?? ??? ??? ??? ?Thread.sleep(200); ?
?? ??? ??? ??? ?//進(jìn)入了阻塞狀態(tài),然后200s以后我就重新等待CPU的調(diào)用
?? ??? ??? ??? ?//繼續(xù)執(zhí)行下面的代碼
?? ??? ??? ?} catch (InterruptedException e) {
?? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ?}
?? ??? ??? ?System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);
?? ??? ?
?? ??? ?
?? ?}
?? ?//線程不安全鎖定失敗? ticketNums對象在變(根本原因就是對象的地址發(fā)生了改變)? ?
??? //?? ?對象在變和對象的屬性再變是兩回事
?? ?public? void test3() {
?? ??? ?synchronized ((Integer)ticketNums) {
?? ??? ??? ?if(ticketNums<0) {
?? ??? ??? ??? ?flag=false;
?? ??? ??? ??? ?return;
?? ??? ??? ?}
?? ??? ??? ?//模擬網(wǎng)絡(luò)延時(shí)
?? ??? ??? ?try {
?? ??? ??? ??? ?Thread.sleep(200); ?
?? ??? ??? ??? ?//進(jìn)入了阻塞狀態(tài),然后200s以后我就重新等待CPU的調(diào)用
?? ??? ??? ??? ?//繼續(xù)執(zhí)行下面的代碼
?? ??? ??? ?} catch (InterruptedException e) {
?? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ?}
?? ??? ??? ?System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);
?? ??? ?}
?? ??? ?
?? ?}
?? ?
?? ?
?? ?
?? ?
?? ?//同步塊??? 范圍太大性能效率低下
?? ?public? void test2() {
?? ??? ?synchronized (this) {
?? ??? ??? ?if(ticketNums<0) {
?? ??? ??? ??? ?flag=false;
?? ??? ??? ??? ?return;
?? ??? ??? ?}
?? ??? ??? ?//模擬網(wǎng)絡(luò)延時(shí)
?? ??? ??? ?try {
?? ??? ??? ??? ?Thread.sleep(200); ?
?? ??? ??? ??? ?//進(jìn)入了阻塞狀態(tài),然后200s以后我就重新等待CPU的調(diào)用
?? ??? ??? ??? ?//繼續(xù)執(zhí)行下面的代碼
?? ??? ??? ?} catch (InterruptedException e) {
?? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ?}
?? ??? ??? ?System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);
?? ??? ?}
?? ??? ?
?? ?}
?? ?
?? ?
?? ?
?? ?
?? ?
?? ?//線程安全,同步
?? ?public synchronized void test1() {
?? ??? ?if(ticketNums<0) {
?? ??? ??? ?flag=false;
?? ??? ??? ?return;
?? ??? ?}
?? ??? ?//模擬網(wǎng)絡(luò)延時(shí)
?? ??? ?try {
?? ??? ??? ?Thread.sleep(200); ?
?? ??? ??? ?//進(jìn)入了阻塞狀態(tài),然后200s以后我就重新等待CPU的調(diào)用
?? ??? ??? ?//繼續(xù)執(zhí)行下面的代碼
?? ??? ?} catch (InterruptedException e) {
?? ??? ??? ?e.printStackTrace();
?? ??? ?}
?? ??? ?System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);
?? ?}
?? ?
}
標(biāo)簽: