从头认识多线程-1.12 suspend和resume缺点-不同步

这一章节我们继续来讨论suspend和resume的另一个缺点-不同步。

1.代码清单

package com.ray.deepintothread.ch01.topic_12;

public class SuspendUnSynch {
	public static void main(String[] args) throws InterruptedException {
		MyObject myObject = new MyObject();

		ThreadOne threadOne = new ThreadOne(myObject);
		Thread thread = new Thread(threadOne);
		thread.start();

		ThreadTwo threadTwo = new ThreadTwo(myObject);
		Thread thread2 = new Thread(threadTwo);
		thread2.start();
	}
}

class MyObject {
	private int id = 0;

	private String name = "init";

	@SuppressWarnings("deprecation")
	public void set(int id, String name) {
		this.id = id;
		Thread.currentThread().suspend();
		this.name = name;
	}

	public void printStr() {
		System.out.println(id + " " + name);
	}
}

class ThreadOne implements Runnable {

	private MyObject myObject;

	public ThreadOne(MyObject myObject) {
		this.myObject = myObject;
	}

	@Override
	public void run() {
		myObject.set(1, "ray");
	}
}

class ThreadTwo implements Runnable {

	private MyObject myObject;

	public ThreadTwo(MyObject myObject) {
		this.myObject = myObject;
	}

	@Override
	public void run() {
		myObject.printStr();
	}
}

输出:

1 init

2.解释

虽然上面的例子笔者觉得还是有点不切当,但是它确实形成了上面我们所说的结果,数据不同步。

不切当的原因:如果我们通过时间的调整,把两个方法之间的等待时间(或者叫执行时间)调整一下,有可能就会出现上面的结果,当然,我们通过上面的代码,是必然会出现这个不同步的结果。因此,个人觉得这个例子有点不切当,如果读者有更好的例子,请告知

总结:这一章节展示了suspend和resume的另一个缺点-数据不同步。

我的github:https://github.com/raylee2015/DeepIntoThread

时间: 2024-07-29 23:35:56

从头认识多线程-1.12 suspend和resume缺点-不同步的相关文章

从头认识多线程-2.12 synchronized ()代码块不单可以用this,也可以用其他对象

这一章节我们来讨论一下synchronized ()代码块的另一个用法,它不单可以用this,也可以用其他对象. 1.代码清单 package com.ray.deepintothread.ch02.topic_13; /** * * @author RayLee * */ public class ObjectLock { public static void main(String[] args) throws InterruptedException { MyService myServi

JAVA多线程suspend()、resume()和wait()、notify()的区别(转载)

suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的 resume() 被调用,才能使得线程重新进入可执行状态.典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情 形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复.但suspend()方法很容易引起死锁问题, 已经不推荐使用了. wait() 和 notify() 方法:两个方法配

Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated ?

Thread.stop, Thread.suspend, Thread.resume被标记为废弃的方法.在查看JDK的文档时,提到了下面的参考文章,先是英文版,接着是中文翻译. Why is Thread.stop deprecated?Because it is inherently unsafe. Stopping a thread causes it to unlock all the monitors that it has locked. (The monitors are unloc

Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别

从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务. 但是当前正在被服务的线程可能觉得cpu的服务质量不够好,于是提前退出,这就是yield. 或者当前正在被服务的线程需要睡一会,醒来后继续被服务,这就是sleep. sleep方法不推荐使用,可用wait. 线程退出最好自己实现,在运行状态中一直检验一个状态,如果这个状态为真,就一直运行,如果外界更改了这个状态变量,那么线程就停止运行. sleep(

从头认识多线程-2.8 缓解同步方法的隐患-同步代码块

这一章节我们来讨论一下缓解同步方法的隐患-同步代码块. 1.思路:把同步方法,降低同步的粒度,同步到代码块 2.根据上一章节的例子,我们把代码修改一下 (1)第一种方法,把同步标记移到更新的那一栏里面去,一般来说大部分都是更新的时候需要同步数据 package com.ray.deepintothread.ch02.topic_9; /** * 从头认识多线程-2.8 缓解同步方法的隐患-同步代码块<br> * * @author RayLee * */ public class Relief

Linux的suspend和resume

参考: www.wowotech.net/linux_kenrel/suspend_and_resume.htmlwww.wowotech.net/linux_kenrel/pm_interface.html 一.基本介绍 1.Window下的睡眠就是Suspend to RAM, 休眠就是Suspend to Disk,Ubuntu中Suspend就是Stand by(没有实现Suspend to RAM),Hibernate就是Suspend to Disk.2.设备驱动若是关注睡眠和唤醒功

Java多线程基础(四)Java传统线程同步通信技术

Java多线程基础(四)Java传统线程同步通信技术 编写代码实现以下功能 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次. 分析 1)子线程循环10次与主线程循环100次必须是互斥的执行,不能出现交叉,下面代码中通过synchronized关键字实现此要求: 2)子线程与主线程必须交替出现,可以通过线程同步通信技术实现,下面代码中通过bShouldSub变量实现此要求: 其他需要注意的地方 1)其中business变量必须声

java多线程的等待唤醒机制及如何解决同步过程中的安全问题

/* class Person{ String name; String sex; boolean flag = true; public void setPerson(String name, String sex){ this.sex=sex; this.name=name; } } class Input implements Runnable{ int x=0; Person p; Input(Person p){ this.p=p; } public void run(){ while

iOS多线程的初步研究(十)-- dispatch同步

GCD提供两种方式支持dispatch队列同步,即dispatch组和信号量. 一.dispatch组(dispatch group) 1. 创建dispatch组 dispatch_group_t group = dispatch_group_create(); 2. 启动dispatch队列中的block关联到group中 dispatch_group_async(group, queue, ^{ // ... }); 3. 等待group关联的block执行完毕,也可以设置超时参数 dis