大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
synchronized void getName(){
创新互联是一家专注于成都网站建设、成都做网站与策划设计,城厢网站建设哪家好?创新互联做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:城厢等地区。城厢做网站价格咨询:18980820575
//......代码
}
等价于
void getName(){
synchronized(this){
//......代码
}
}
不知道你说的是不是这个问题
你的synchronized将while循环都锁住了,所以其中一个线程会将整个while循环执行玩再走其他线程,但你的共享数据这时候已经被循环至0了,所以只有一个线程在执行
你的这句话放在run方法里面了:Object b=new Object();
是局部变量,一直在变化,造成锁一直在变化,所以出现了问题。
1.把 synchronized (i) { 放在 while外面就没问题的
2.同步代码块的原则之一是:尽量只包计算的部分。原则之二:计量要尽量避免其中包了sleep或者yield方法。sleep是为while服务的,如果把同步放在while之内,同步把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;多线程模拟售票:三个窗口售票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()) { // 同步代码块,防止多个线程进入
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;// 同步代码块,防止多个线程进入
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;// 同步代码块,防止多个线程进入
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秒,测试线程安全问题
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;}
}
楼主你仔细看下我该了以后的代码,先找到区别
有两点楼主要注意:
一、synchronized(newObject())相当于没有同步,同步的是同一块内存地址,你这样的话,每次都不是同一块内存地址,因此相当于没有同步
二、同步的范围:同步的范围不是越大越好,仔细想想看吧楼主,你的同步范围太大了