`

多线程与同步synchronized

    博客分类:
  • Java
 
阅读更多
package com.thread.sym;

public class TestThread {

		/**
	 * 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。
	 * 同步
	 * 打印结果:
	 * Thread-0:1
Thread-1:2
Thread-1:3
Thread-1:4
Thread-1:5
Thread-1:6
Thread-1:7
Thread-1:8
Thread-1:9
Thread-1:10
Thread-1:11
Thread-0:12
Thread-0:13
Thread-0:14
Thread-0:15
Thread-0:16
Thread-0:17
Thread-0:18
Thread-0:19
Thread-0:20
Thread-2:19
Thread-2:18
Thread-2:17
Thread-2:16
Thread-2:15
Thread-2:14
Thread-2:13
Thread-2:12
Thread-2:11
Thread-2:10
Thread-3:9
Thread-3:8
Thread-3:7
Thread-3:6
Thread-3:5
Thread-3:4
Thread-3:3
Thread-3:2
Thread-3:1
Thread-3:0

	 */
	public  int j = 0;

	public static void main(String[] args) {
		TestThread testThread = new TestThread();
		myThread1 my11 = testThread.new myThread1();
		myThread1 my12 = testThread.new myThread1();
		myThread2 my21 = testThread.new myThread2();
		myThread2 my22 = testThread.new myThread2();
		Thread tmy11 = new Thread(my11);
		Thread tmy12 = new Thread(my12);
		Thread tmy21 = new Thread(my21);
		Thread tmy22 = new Thread(my22);
		tmy11.start();
		tmy12.start();
		tmy21.start();
		tmy22.start();

	}

	class myThread1 implements Runnable {
		/*
		 * 此方法实现对j增加
		 */

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

		}

	}

	private class myThread2 implements Runnable {
		/*
		 * 此方法实现对j减少
		 */
		@Override
		public void run() {
			for (int i = 0; i < 10; i++) {
				dec();
			}
		}

	}
//同步的一种方式:同步方法
	public synchronized  void inc(){
		j++;
		System.out.println(Thread.currentThread().getName() + ":" + j);
	}
	public synchronized  void dec(){
		j--;
		System.out.println(Thread.currentThread().getName() + ":" + j);
	}
//同步的另一种方式:同步块
	/*public   void inc(){
		synchronized(this){
		j++;
		System.out.println(Thread.currentThread().getName() + ":" + j);
		}
	}
	public   void dec(){
		synchronized(this){
		j--;
		System.out.println(Thread.currentThread().getName() + ":" + j);
		}
	}*/
}

package com.thread.sym;

public class TestThread {

	/**
	 * 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。
	 * 不同步
	 * 打印结果:
	 Thread-0:1
Thread-2:1
Thread-2:0
Thread-1:2
Thread-2:-1
Thread-3:1
Thread-3:-2
Thread-3:-3
Thread-0:2
Thread-3:-4
Thread-2:-1
Thread-1:0
Thread-1:-4
Thread-1:-3
Thread-1:-2
Thread-1:-1
Thread-1:0
Thread-1:1
Thread-1:2
Thread-1:3
Thread-2:-5
Thread-3:-4
Thread-0:-3
Thread-3:1
Thread-2:2
Thread-3:1
Thread-0:2
Thread-3:-1
Thread-2:0
Thread-3:-1
Thread-0:0
Thread-3:-3
Thread-2:-2
Thread-2:-3
Thread-0:-2
Thread-2:-4
Thread-0:-3
Thread-0:-2
Thread-0:-1
Thread-0:0

	 */
	public  int j = 0;

	public static void main(String[] args) {
		TestThread testThread = new TestThread();
		myThread1 my11 = testThread.new myThread1();
		myThread1 my12 = testThread.new myThread1();
		myThread2 my21 = testThread.new myThread2();
		myThread2 my22 = testThread.new myThread2();
		Thread tmy11 = new Thread(my11);
		Thread tmy12 = new Thread(my12);
		Thread tmy21 = new Thread(my21);
		Thread tmy22 = new Thread(my22);
		tmy11.start();
		tmy12.start();
		tmy21.start();
		tmy22.start();

	}

	class myThread1 implements Runnable {
		/*
		 * 此方法实现对j增加
		 */

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

		}

	}

	private class myThread2 implements Runnable {
		/*
		 * 此方法实现对j减少
		 */
		@Override
		public void run() {
			for (int i = 0; i < 10; i++) {
				dec();
			}
		}

	}
	public   void inc(){
		j++;
		System.out.println(Thread.currentThread().getName() + ":" + j);
	}
	public   void dec(){
		j--;
		System.out.println(Thread.currentThread().getName() + ":" + j);
	}
}
/*
 * Thread 的一般方法:
 * sleep:静态方法,使用方式Thread.sleep(1000),一定会抛出异常,由于是运行在run中,一定要采用catch,而不能用throws捕获
 *        采用Thread.interrupt()可以让线程停止,但是不推荐此方法,可以采用flag标识来让线程停止。stop()方式已经废弃
 * join:合并线程。myThread myt=new myThread();myt.start();myt.join();这样就相当于和主线程合并,变成了一个线程,按照正常的程序逻辑进行
 * yield:高风亮节。只让别的线程先执行一下,过一会还是要执行:
 * @Override
		public void run() {
			for (int i = 0; i < 20; i++) {	
				if (i % 4 == 0) {
					Thread.yield();
				}
				System.out.println(Thread.currentThread().getName()+":"+i);
			
			}
		}
  Priority:优先级myThread myt=new myThread();myt.setPriority(Thread.NORM_PRIORITY+3);这样将获得更好的优先,时间片更多
  线程同步两种方法:同步方法和同步块
  sleep和wait的区别:
  1.都是用于对线程的控制,但是sleep不释放同步锁,wait释放同步锁
    sleep是Thread的静态方法,可以设置时间(单位为毫秒),如果需要终止,可以设置interrupted或者设置标识来终止;wait是Object的方法,不要设置时间,通过别的线程调用同一对象的notify来终止。
  2.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。
3.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。
  
 */
package com.wait.sym;

public class Demo {
	public static void main(String[] args) {
		ThreadDemo b = new ThreadDemo();
		b.start();
		System.out.println("b is start....");
		synchronized (b) {
			try {
				System.out.println("Waiting for b to complete...");
				// b.wait(3000);
				b.wait();
				System.out.println("Completed.Now back to main thread");
			} catch (InterruptedException e) {
			}
		}
		System.out.println("Total is :" + b.total);
	}
}

class ThreadDemo extends Thread {
	int total;

	public void run() {
		try {
			Thread.sleep(2000);
			synchronized (this) {
				System.out.println("ThreadB is running..");
				for (int i = 0; i < 10; i++) {
					total += i;

					// if(i==30){Thread.sleep(3000);} //当 i=30的时候,让当前线程睡眠3秒
					System.out.println("total is " + total);
				}
				this.notify();
			}
		} catch (InterruptedException e1) {

			e1.printStackTrace();
		}
	}
}
/*打印结果:b is start....
Waiting for b to complete...
ThreadB is running..
total is 0
total is 1
total is 3
total is 6
total is 10
total is 15
total is 21
total is 28
total is 36
total is 45
Completed.Now back to main thread
Total is :45*/

分享到:
评论

相关推荐

    Java多线程同步.pdf

    Java多线程同步是指在Java语言中,如何使用synchronized关键字和其他同步机制来确保多线程程序的正确执行。在Java语言中,synchronized关键字用于对方法或者代码块进行同步,但是仅仅使用synchronized关键字还不能...

    java的线程同步机制synchronized关键字的理解_.docx

    Java 线程同步机制中 synchronized 关键字的理解 Java 的线程同步机制是为了解决多个线程共享同一片存储空间所带来的访问冲突问题。其中,synchronized 关键字是 Java 语言中解决这种冲突的重要机制。 ...

    正确使用多线程同步锁@synchronized()1

    总结起来,`@synchronized`是一种便捷的多线程同步手段,通过递归互斥锁实现代码的原子性。在使用时应注意以下几点: 1. `@synchronized`是基于对象的,传入的对象不能为`nil`,否则无效。 2. 由于使用了递归锁,它...

    多线程不同步演示2

    本示例"多线程不同步演示2"就是针对这些挑战的一个实例,它通过一个线程写数据,另一个线程读取数据来展示不加同步控制时可能出现的问题。 首先,我们需要理解多线程中的“同步”概念。同步是为了确保多个线程在...

    多线程同步和通讯完整示例

    在编程领域,尤其是在Java这样的多线程环境中,理解和掌握多线程同步与通讯至关重要。本文将深入探讨这些概念,以及如何使用synchronized关键字、wait-notify机制和Lock接口来实现线程间的同步与通讯。 首先,多...

    java同步synchronized关键字用法示例

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源时的同步机制。在Java中,当多个线程试图同时访问和修改同一块代码或数据时,可能会导致数据不一致的问题。为了解决这个问题,...

    java多线程同步问题

    多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!

    简单实现多线程同步示例(模拟购票系统)

    本示例“简单实现多线程同步示例(模拟购票系统)”旨在通过一个具体的实例,帮助开发者理解如何在Java中创建并管理多线程以及如何实现线程同步,确保数据的一致性和正确性。 首先,我们要明确多线程的基本概念。在...

    Java线程及同步(synchronized)样例代码

    该示例展示了如何在多线程环境中使用`synchronized`关键字来实现线程间的同步,以避免数据竞争和不一致的问题。通过具体的代码实现,我们将深入理解Java中的线程同步机制,并学习如何在实际编程中正确地使用这些机制...

    操作系统实验 多线程同步与互斥 java编写 有界面

    操作系统实验是计算机科学教育中的重要组成部分,它帮助学生理解和掌握操作系统的基本原理,特别是多线程同步与互斥的概念。在Java编程环境下,这些概念可以通过实际的代码实现来深入理解。 多线程是现代操作系统中...

    c# 多线程 同步问题解决

    "C# 多线程同步问题解决" C# 中的多线程机制是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务。这可以提高 CPU 的利用率,因为任何一个程序员都不希望自己的程序很多时候没事...

    Java多线程和同步

    Java线程(二):线程同步synchronized和volatile 详细讲解Java 同步的原理技术资料

    java 多线程同步方法的实例

    在Java编程语言中,多线程同步是一种控制多个线程并发执行的重要机制,它确保了共享资源的安全访问,防止数据不一致性和竞态条件的发生。本文将深入探讨Java中的多线程同步方法,并通过实例来阐述其工作原理。 首先...

    java 多线程synchronized互斥锁demo

    标题中的"java 多线程synchronized互斥锁demo"指的是一个示例,展示了如何在多线程环境下使用`synchronized`关键字创建互斥锁,确保同一时间只有一个线程可以访问特定的代码块或方法。 描述中的"一个多线程访问的同...

    Java多线程同步机制研究分析.pdf

    Java多线程同步机制有两种类型:synchronized方法和synchronized块。synchronized方法是将访问共享资源的方法标记为synchronized,然后该标记的方法来控制对类成员变量的访问。synchronized块是将程序的某段代码使用...

    NET多线程同步方法详解

    .NET中的多线程同步是确保在并发环境下多个线程安全访问共享资源的关键技术。本文将深入探讨.NET框架中实现线程同步的多种方法。 首先,我们来看自由锁(InterLocked)。自由锁主要通过Interlocked类提供的静态方法来...

    使用synchronized实现多线程同步.pdf

    在Java编程中,多线程同步是一个至关重要的概念,它确保了多个线程在访问共享资源时能够有序进行,防止数据不一致性和竞态条件。`synchronized`关键字是Java中实现线程同步的主要手段之一。这篇文档主要讨论了如何...

    JNI 多线程同步机制的源码实现

    本文将深入探讨如何使用JNI实现多线程同步,并通过源码来解析这一过程。 1. **JNI基础知识** JNI为Java程序员提供了一种方式,可以在Java代码中调用本地方法,反之亦然。它定义了一系列的函数,例如`FindClass`...

Global site tag (gtag.js) - Google Analytics