synchronized-多线程同步时用if和else输出的结果不一样

问题描述

多线程同步时用if和else输出的结果不一样

解决方案

关键是this.wait()和this.notify(),如果是两个if,则本次set或者print中,所有代码都会执行一次,也就是每次执行set或者print方法,一个wait一个notify,刚好配对,所以set一次,打印一次
如果用else,则每次方法内wait后被notify唤醒后,不会执行else分支,所以也就不会被print出来。
实际你可以在

 while(true)    {        if(flag==0)        {            p.set(""mike""man"");        }        else        {            p.set(""丽丽丽丽""女女女女"");        }        System.out.println(""flag=""+flag);  //这里输出日志,你就可以看清了,值是有变化的,只是print没有每次打印。        flag=(flag+1)%2;    }

解决方案二:
你的代码太乱了,没法回答啊,但感觉问题蛮大的,首先线程能这样启动吗?你到底要执行什么功能(或者说语句)。。。

时间: 2024-12-03 20:34:23

synchronized-多线程同步时用if和else输出的结果不一样的相关文章

Java多线程编程中synchronized线程同步的教程_java

0.关于线程同步 (1)为什么需要同步多线程?线程的同步是指让多个运行的线程在一起良好地协作,达到让多线程按要求合理地占用释放资源.我们采用Java中的同步代码块和同步方法达到这样的目的.比如这样的解决多线程无固定序执行的问题: public class TwoThreadTest { public static void main(String[] args) { Thread th1= new MyThread1(); Thread th2= new MyThread2(); th1.sta

多线程-synchronized java “同步”

问题描述 synchronized java "同步" 在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行.synchronized既可以加在一段代码上,也可以加在方法上. 知道synchronized是干什么的了,但还是不理解"同步"二字表示什么意思?与其作用关联不到一起: synchronized是用来控制线程不能同步的,多个线程不能同时执行某段代码的步骤,应该是这样理解

Java多线程--同步与死锁:synchronized;等待与唤醒:wait、notify、notifyAll;生命周期

1.问题的引出 class MyThread implements Runnable{ private int ticket = 5 ; // 假设一共有5张票 public void run(){ for(int i=0;i<100;i++){ if(ticket>0){ // 还有票 try{ Thread.sleep(300) ; // 加入延迟 }catch(InterruptedException e){ e.printStackTrace() ; } System.out.prin

多线程同步synchronized问题

问题描述 在多线程同步的时候,synchronized(object ){//同步代码块},其中同步的代码块和加锁的对象object有必然关系吗?他们关系怎样? 解决方案 没有关系!synchronized(object ){ //同步代码块 }表示只有当前这个对象拿到object这个对象的锁才能执行同步代码块中的代码每一个对象有一个对象锁,但是每一个对象只有一个Class锁解决方案二:synchronized(object)中的object使用什么决定了锁定的范围,通常可能会简单的使用this

JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this

JAVA之旅(十三)--线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程)把票陆陆续续的卖完了之后,我们要反思一下,这里面有没有安全隐患呢?在实际情况中,这种事情我们是必须要去考虑安全问题的,那我们模拟一下错误 package com.lgl.hellojava; import javax.security.auth.callback.TextInputCallback

Java多线程初学者指南(10):使用Synchronized关键字同步类方法

要想解决"脏数据"的问题,最简单的方法就是使用synchronized关键字来使run方法同步,代码如下: public synchronized void run() { } 从上面的代码可以看出,只要在void和public之间加上synchronized关键字,就可以使run方法同步,也就是说,对于同一个Java类的对象实例,run方法同时只能被一个线程调用,并当前的run执行完后,才能被其他的线程调用.即使当前线程执行到了run方法中的yield方法,也只是暂停了一下.由于其他

java多线程编程之使用Synchronized关键字同步类方法_java

复制代码 代码如下: public synchronized void run(){     } 从上面的代码可以看出,只要在void和public之间加上synchronized关键字,就可以使run方法同步,也就是说,对于同一个Java类的对象实例,run方法同时只能被一个线程调用,并当前的run执行完后,才能被其他的线程调用.即使当前线程执行到了run方法中的yield方法,也只是暂停了一下.由于其他线程无法执行run方法,因此,最终还是会由当前的线程来继续执行.先看看下面的代码:sych

java多线程编程之使用Synchronized块同步变量_java

下面的代码演示了如何同步特定的类方法: 复制代码 代码如下: package mythread; public class SyncThread extends Thread{ private static String sync = ""; private String methodType = "";  private static void method(String s) {  synchronized (sync)  {sync = s;System.ou

Servlet及JSP中的多线程同步问题

js|servlet|多线程|问题 Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率.由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的同步问题.然而,很多人编写Servlet/JSP程序时并没有注意到多线程同步的问题,这往往造成编写的程序在少量用户访问时没有任何问题,而在并发用户上升到一定值时,就会经常出现一些莫明其妙的问题,对于这类随机性的问题调试难度也很大. 一.在Servlet/JSP中的几种变量类型 在