Java同步代码块没效果,一个类中只能有一个同步方法或同步代码块

java同步代码块的问题?

synchronized void getName(){

创新互联是一家专注于成都网站建设、成都做网站与策划设计,城厢网站建设哪家好?创新互联做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:城厢等地区。城厢做网站价格咨询:18980820575

//......代码

}

等价于

void getName(){

synchronized(this){

//......代码

}

}

不知道你说的是不是这个问题

Java多线程我用了同步代码块之后,为什么一直都是主线程在执行,别的线程根本没执行?

你的synchronized将while循环都锁住了,所以其中一个线程会将整个while循环执行玩再走其他线程,但你的共享数据这时候已经被循环至0了,所以只有一个线程在执行

学java中,一个卖票程序,同步代码块 synchronized(){},没起作用,依然输出0和负号票,怎么回事?

你的这句话放在run方法里面了:Object b=new Object();

是局部变量,一直在变化,造成锁一直在变化,所以出现了问题。

java同步代码块问题

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--);

}

}

}

}

Java中 synchronized没有用,代码如下。运行结果如图(不该出现非正数)。谢谢高手解答!!

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())相当于没有同步,同步的是同一块内存地址,你这样的话,每次都不是同一块内存地址,因此相当于没有同步

二、同步的范围:同步的范围不是越大越好,仔细想想看吧楼主,你的同步范围太大了


分享名称:Java同步代码块没效果,一个类中只能有一个同步方法或同步代码块
本文网址:http://scyanting.com/article/dsedhhg.html