synchronized void getName(){
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、成都做網(wǎng)站與策劃設(shè)計(jì),城廂網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:城廂等地區(qū)。城廂做網(wǎng)站價(jià)格咨詢:18980820575
//......代碼
}
等價(jià)于
void getName(){
synchronized(this){
//......代碼
}
}
不知道你說的是不是這個(gè)問題
你的synchronized將while循環(huán)都鎖住了,所以其中一個(gè)線程會(huì)將整個(gè)while循環(huán)執(zhí)行玩再走其他線程,但你的共享數(shù)據(jù)這時(shí)候已經(jīng)被循環(huán)至0了,所以只有一個(gè)線程在執(zhí)行
你的這句話放在run方法里面了:Object b=new Object();
是局部變量,一直在變化,造成鎖一直在變化,所以出現(xiàn)了問題。
1.把 synchronized (i) { 放在 while外面就沒問題的
2.同步代碼塊的原則之一是:盡量只包計(jì)算的部分。原則之二:計(jì)量要盡量避免其中包了sleep或者yield方法。sleep是為while服務(wù)的,如果把同步放在while之內(nèi),同步把sleep給包括了,那么sleep就沒有意義了。
我覺得這樣寫最好:
public void run() {
while (true) {
try {
Thread.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
synchronized (i) {
if (i 0) {
System.out.println(Thread.currentThread().getName()
+ " == " + i--);
}
}
}
}
package ergouge.thread.demo;
/*
nbsp;多線程模擬售票:三個(gè)窗口售票20張
nbsp;*/
class Ticket implements Runnable {
nbsp;nbsp;nbsp;nbsp;private int num = 20;
nbsp;nbsp;nbsp;nbsp;final String s = "hell";
nbsp;nbsp;nbsp;nbsp;public void run() { // 覆蓋run方法
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;sell();
nbsp;nbsp;nbsp;nbsp;}
nbsp;nbsp;nbsp;nbsp;// 解決線程安全
nbsp;nbsp;nbsp;nbsp;public void sell() {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;// synchronized (new Object()) { // 同步代碼塊,防止多個(gè)線程進(jìn)入
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;// 同步代碼塊,防止多個(gè)線程進(jìn)入
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;while (num gt; 0) {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;// 放到這里也不行 synchronized(new Object()) { //
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;// 同步代碼塊,防止多個(gè)線程進(jìn)入
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;synchronized (s) {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;try {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Thread.sleep(500);
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;} catch (InterruptedException e) {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;} // 讓線程sleep 0.5秒,測(cè)試線程安全問題
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;System.out.println(Thread.currentThread().getName() + "...sell ticket " + num--);
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}
nbsp;nbsp;nbsp;nbsp;}
}
public class TicketSale {
nbsp;nbsp;nbsp;nbsp;public static void main(String[] args) {
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Ticket x = new Ticket();
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Thread t1 = new Thread(x);
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Thread t2 = new Thread(x);
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Thread t3 = new Thread(x);
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;t1.start();
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;t2.start();
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;t3.start();
nbsp;nbsp;nbsp;nbsp;}
}
樓主你仔細(xì)看下我該了以后的代碼,先找到區(qū)別
有兩點(diǎn)樓主要注意:
一、synchronized(newObject())相當(dāng)于沒有同步,同步的是同一塊內(nèi)存地址,你這樣的話,每次都不是同一塊內(nèi)存地址,因此相當(dāng)于沒有同步
二、同步的范圍:同步的范圍不是越大越好,仔細(xì)想想看吧樓主,你的同步范圍太大了
名稱欄目:Java同步代碼塊沒效果,一個(gè)類中只能有一個(gè)同步方法或同步代碼塊
網(wǎng)站路徑:http://jinyejixie.com/article46/dsedhhg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、靜態(tài)網(wǎng)站、網(wǎng)站營銷、網(wǎng)站改版、網(wǎng)站建設(shè)、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)