线程---同步(synchronized)

实现线程同步的一种方式介绍:

思路:

    首先,需要被协调的类,先实现线程,并重写run方法

    然后,在被协调的类中私有化控制器,控制器实例化,由构造器带入。

    其次,由控制器对象具体负责调用。

举例:循环输出A/B/C

main:

public class Test {
	public static void main(String[] args) {
		Controller controller = new Controller();
		new A(controller).start();;
		new B(controller).start();;
		new C(controller).start();;
	}
}

控制器:

public class Controller {

	private int f=0;

	public synchronized void printA(){
		if(f==0){
			System.out.println("A");
			f=1;
			notifyAll();
		}
		try {
			wait();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public synchronized void printB(){
		if(f==1){
			System.out.println("B");
			f=2;
			notifyAll();
		}
		try {
			wait();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public synchronized void printC(){
		if(f==2){
			System.out.println("C");
			f=0;
			notifyAll();
		}
		try {
			wait();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

线程A:

public class A extends Thread{

	private Controller controller;

	A(Controller controller){
		this.controller = controller;
	}

	@Override
	public synchronized void run() {
		for (int i = 0; i < 10; i++) {
			controller.printA();
		}
	}

}

  

线程B:

public class B extends Thread{

	private Controller controller;

	B(Controller controller){
		this.controller = controller;
	}

	@Override
	public synchronized void run() {
		for (int i = 0; i < 10; i++) {
			controller.printB();
		}
	}
}

  

线程C:

public class C extends Thread{

	private Controller controller;

	C(Controller controller){
		this.controller = controller;
	}

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			controller.printC();
		}
	}
}

 

输出:

A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C

原文地址:https://www.cnblogs.com/pecool/p/9536931.html

时间: 2024-11-13 04:00:49

线程---同步(synchronized)的相关文章

Java线程(二):线程同步synchronized和volatile

上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程共享的,一个线程改变了其成员变量num值,下一个线程正巧读到了修改后的num,所以会递增输出. 要说明线程同步问题首先要说明Java线程的两个特性,可见性和有序性.多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现.拿上篇博文中的例子来说明,在多个线程之间共享了Count类的

java线程同步-synchronized

什么是"线程同步" ? 所谓线程同步就是若干个线程都需要使用一个 synchronized(同步)修饰的方法,当一个线程使用synchronized方法时,其他线程想使用这个synchronized方法时就必须等待,直到这个线程使用完该 synchronized 方法. 在下面的例子中有两个线程,会计和出纳,他俩共同拥有一个账本,她俩都可以使用saveOrTake(int amount)方法对账本进行访问,会计使用saveOrTake(int mount)方法时,向账本上写入存钱记录:

多线程 Thread 线程同步 synchronized

1.多线程基础以及两种启用方式 /** * 多线程 * 多线程改变了代码的执行方式,从原有的所有代码都串行操作改变为多个代码片段之间并行操作. * 因此多线程允许多个代码片段"同时运行". * * 创建线程的方式有两种 * 1:继承线程并重写run方法,在run方法中定义线程要执行的任务. */ public class ThreadDemo1 { public static void main(String[] args) { Thread t1 = new MyThread1();

线程同步synchronized,Class与Object

synchronized (class):class类的同步,同步的时候会同步整个class 与 synchronized (Object):Object的同步,只对其中的对象同步 如下:对类B中的同步代码块的同步,对比之后放可明白 synchronized (MyThread.class) 例: A:类UnsafeSequence public class UnsafeSequence {    private static int value;        public int getVa

三、线程同步Synchronized

参考:https://blog.csdn.net/zjy15203167987/article/details/82531772 https://blog.csdn.net/luoweifu/article/details/46613015 一.并发 同一个对象多个线程同时操作 原文地址:https://www.cnblogs.com/qiaoxin11/p/12628660.html

Java之线程,常用方法,线程同步,死锁

1, 线程的概念 进程与线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小.(线程是cpu调度的最小单位) 切换而不是同步 一个程序中的方法有几条执行路径, 就有几个线程 Java中线程的生命周期 Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t =

线程同步初解---转载

//线程安全问题的原因其实就是:线程执行多条语句的时候出现了阻塞,然后没有执行完该线程另一线程就启动了. //解决方法就是同步代码块:synchronized(对象) //synchronized(对象) //{ //  需要同步的代码 //} class Ticket implements Runnable { private int ticket = 100; Object obj = new Object(); public void run() { while(true) { synch

Java基础教程——线程同步

线程同步 synchronized:同步的 例:取钱 不做线程同步的场合,假设骗子和户主同时取钱,可能出现这种情况: [骗子]取款2000:账户余额1000 [户主]取款2000:账户余额1000 结果是社会财富增加1000,银行不开心. 代码如下所示: // 账户类 class Account { private int accountBalance = 2000; public void withdraw(String userName, int amount) { System.out.p

【java并发】(2) Java线程同步:synchronized锁住的是代码还是对象

在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行.synchronized既可以加在一段代码上,也可以加在方法上. 关键是,不要认为给方法或者代码段加上synchronized就万事大吉,看下面一段代码: class Sync { public synchronized void test() { System.out.println("test开始.."); try { Thread.sle

线程的同步synchronized

一个Java程序的多线程之间可以共享数据. 当线程以异步方式访问共享数据时,有时候是不安全的或者不和逻辑的.比如卖火车票,同一时刻一个线程在读取数据,另外一个线程在处理数据,当处理数据的线程没有等到读取数据的线程读取完毕就去处理数据,必然得到错误的处理结果. 卖火车票Demo: class MyThread implements Runnable{ private int ticket = 5 ; // 假设一共有5张票 public void run(){ for(int i=0;i<100;