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同步代码块没效果,一个类中只能有一个同步方法或同步代码块
网站路径:https://www.cdcxhl.com/article46/dsedhhg.html

成都网站建设公司_创新互联,为您提供企业网站制作静态网站网站营销网站改版网站建设微信小程序

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

手机网站建设