`

java中的线程同步

阅读更多
在java中,每一个线程都是由Thread类对象创建和控制的。通常我们有两种方式来创建一个线程,一种是继承java.lang.Thread 类,第二种是创建类的时候实现Runnable接口。下面分别介绍两种方式。

1,继承Thread类
首先创建Thread子类的一个实例,然后重写run方法,然后子类的实例必须调用start()方法之后run方法才被执行. 代码如下:
public class MultiThread extends Thread {
	public void run() {
		System.out.println(getName()+"线程开始运行");
		for(int i = 0; i< 10; i++) {
			System.out.println(i +" "+getName());
			try{
				sleep((int) Math.random()*10);
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println(getName() + "线程结束");
	}
	public static void main(String[] args) {
		System.out.println(Thread.currentThread().getName()+"线程开始运行");
		new MultiThread().start();
		System.out.println(Thread.currentThread().getName()+"线程结束");	
	}
}


2,实现Runnable接口
首先我们创建一个实现Runnable接口的类ThreadRunnable,为了让线程可以执行接口中的run()方法,我们要在Thread类的构造函数中传入ThreadRunnable的一个实例,这样线程就可以执行run方法。代码如下:
public class ThreadRunnable implements Runnable {
	public int count = 0;
	public void run() {
		System.out.println("线程开始运行");
		try {
			while(count <3){
				Thread.sleep(300);
				count++;
			}
		}catch (InterruptedException e) {
			System.out.println("线程终止");
		}
		System.out.println("线程结束");
	}	
	
	public static void main(String[] args) {
		ThreadRunnable instance = new ThreadRunnable();
		Thread  thread = new Thread(instance);
		thread.start();
	}
}


当我们创建线程的时候,我们一般倾向于实现一个Runnable接口。因为java中不支持多重继承,如果我们继承了Thread类,那这个类就不能继承其他的类了,而如果我们实现了Runnable接口我们还可以继承其它的类。有些时候我们可能仅仅需要让线程运行就可以,当我们继承了Thread类,我们却继承了Thread类所有的方法,过于浪费。

上面简单介绍了java中如何创建线程,下面讨论一下多线程的问题。
在同一程序中运行多个线程本身不会导致问题,但如果多个线程同时访问并修改了相同的资源,就会导致问题。值得我们注意的是,这些问题只有在多个线程向这些资源做了写操作时才有可能发生,多个线程读取相同的资源就是安全的。
下面我们举个例子:
public class ThreadAdd {
	public static void main(String[] args) {
		MyThread instence = new MyThread();
		Thread thread0 = new Thread(instence);
		Thread thread1 = new Thread(instence);
		thread0.start();
		thread1.start();
	}
}
class MyThread implements Runnable {
	private int sum = 0;
	public void run() {
		{
			if(Thread.currentThread().getName().equals("Thread-0")){
				sum += 2;
			}else if(Thread.currentThread().getName().equals("Thread-1"))
				sum += 3;
			System.out.println(sum);
		}
	}	
}

上面的代码中thread0 和thread1执行同一个MyThread对象的方法,我们期望sum最后的结果为5,但事实上sum可能为 2,3,5。导致这个结果的原因时线程在程序中是交错执行的。当两个线程竞争同一个资源时,如果对资源的访问顺序敏感,就出现了这种情况,我们称它为竞态条件,导致竞态条件的方法称为临界区,为了避免这种情况,我们往往在临界区中使用相应的同步机制。常用的有Synchronized,Mutex, Lock和Semaphore。

对于上面的例子我们可以任意选择一种同步机制,例如使用synchronized:
public void run() {
	synchronized(this){
		if(Thread.currentThread().getName().equals("Thread-0")){
			sum += 2;		
		}else if(Thread.currentThread().getName().equals("Thread-1"))
			sum += 3;
		System.out.println(sum);
	}
}	

这样就可以保证sum的最终结果为5。
对于同步锁还有信号量的问题在其他文章里详细介绍。
分享到:
评论

相关推荐

    java中线程同步方法

    ### Java中的线程同步方法详解 #### 引言 在多线程编程中,线程同步是一项关键的技术,用于确保当多个线程访问共享资源时,不会发生数据混乱或竞态条件。Java提供了多种机制来实现线程同步,包括synchronized...

    Java中线程同步和线程协作学习笔记

    在Java编程中,线程同步和线程协作是多线程编程的重要概念,确保了在并发环境下程序的正确性和数据的一致性。线程同步的主要目标是解决线程安全问题,即在多线程访问共享资源时避免数据的混乱,保证程序的可再现性。...

    Java多线程同步.pdf

    Java 多线程同步中的两个特殊类 在Java语言中,有两个特殊的类用于多线程同步,分别是synchronized关键字和ReentrantLock类。 1. synchronized关键字 synchronized关键字是Java语言中的一种同步机制,用于对方法...

    java多线程同步例子

    java多线程同步互斥访问实例,对于初学者或是温故而知新的同道中人都是一个很好的学习资料

    java 实现线程同步的方式有哪些

    Java中的线程同步是解决多线程环境下并发访问共享数据可能导致的数据不一致性问题的关键技术。在Java中,有多种方式可以实现线程同步,确保在任何时刻只有一个线程能够访问特定的共享资源。 1. **同步代码块 ...

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

    Java多线程同步机制是Java编程语言中的一种机制,它允许多个线程同时执行,提高了系统资源的利用率和安全性。但是,多线程中最重要的问题是线程的同步和共享资源的访问保护。本文通过对Java多线程同步机制的研究和...

    基于Java多线程同步的安全性研究.pdf

    最后,文章总结了基于Java多线程同步的安全性研究的重要性和必要性,并提出了解决Java多线程同步机制中安全性问题的方法。本文为Java多线程同步机制的研究和实现提供了有价值的参考。 知识点: 1.Java多线程同步...

    java 多线程同步

    Java多线程同步是Java编程中关键的并发概念,它涉及到如何在多个线程访问共享资源时保持数据的一致性和完整性。`java.util.concurrent`包是Java提供的一个强大的并发工具库,它为开发者提供了多种线程安全的工具,...

    Java多线程同步具体实例讲解 .doc

    Java多线程同步是编程中一个非常重要的概念,特别是在并发编程和高并发系统设计中起到关键作用。在Java中,为了保证线程安全,避免数据竞争和不一致的状态,我们通常会使用同步机制来控制对共享资源的访问。本文将...

    JAVA实现线程间同步与互斥生产者消费者问题

    在Java编程中,线程同步和互斥是多线程编程中的重要概念,它们用于解决多个线程同时访问共享资源时可能出现的问题。本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费...

    java 线程同步 信号量控制同步

    线程同步是 Java 编程中的一种机制,用于控制多个线程之间的资源访问顺序,以避免线程之间的冲突和数据不一致。线程同步的目的就是避免线程“同步”执行,即让多个线程之间排队操作共享资源。 关于线程同步,需要...

    JAVA 线程实现数据库的主从同步更新

    在Java编程环境中,...总之,使用Java线程实现数据库主从同步更新是一种常见且实用的技术手段,它涉及到多线程编程、数据库操作、事务管理等多个方面。理解和掌握这些知识点对于开发高可用性的分布式系统至关重要。

    Java多线程同步具体实例.doc

    Java多线程同步是编程中一个非常重要的概念,特别是在并发编程中,用于解决多个线程访问共享资源时可能引发的数据不一致问题。本实例通过一个简单的火车票售票系统来演示同步机制的应用。 在这个实例中,我们创建了...

    基于Java多线程同步技术的简易模拟售票系统实现.pdf

    根据给定文件的信息,本篇文档是关于Java多线程同步技术在简易模拟售票系统中的应用研究。文档详细介绍了多线程的概念、如何在Java中创建线程、线程同步技术以及如何利用这些技术来解决共享资源访问时的数据一致性...

    java synchronize 线程同步

    Java中的`synchronized`关键字是用于实现线程同步的关键机制,主要目的是解决多线程环境下的数据安全问题。当多个线程访问共享资源时,如果没有适当的同步控制,可能会导致数据不一致或者竞态条件等问题。线程同步...

    Java多线程同步机制的应用分析.pdf

    Java多线程同步机制的应用分析是指在Java语言中,如何使用同步机制来保护临界区,以避免多线程之间的冲突和错误。该机制通过管程机制和同步语法来保护临界区,使得多线程可以安全、高效地运行。 在多线程编程中,...

    java 多线程同步方法的实例

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

Global site tag (gtag.js) - Google Analytics