Java多线程基础四(并发、线程安全、同步、互斥)




在学习Java编程时,会从别人口中听到或其他资料上看到并发、线程安全、同步、互斥等概念,专业术语可以使我们有更清晰的理解,但是也容易让人犯懵,因此专门对这些术语进行解读。




1.并发:


并发比较容易理解,即多个线程并发执行(一并发作),该并发为宏观上的并发,为一个时间段(非时间点)内多个线程可以认为同时执行。因为实际上我们知道多线程实际上是这多个线程抢夺唯一的CPU资源,谁拿到执行权,谁就开始执行,轮流使用CPU进行执行,每个时间点仍是只有一个线程执行。




2.同步:

同步在日常生活中理解为“一起”,在多线程中如果一个数据被多个线程同步(一起)操作时,出现数据混乱,则称为线程不同步,如下代码:


package demo;
/**
 * @author Jie
 */
public class TreadDemo {

	public static void main(String[] args) {
		TicketSell ticketSell = new TicketSell();
		//Create 4 threads
		Thread t1 = new Thread(ticketSell);
		Thread t2 = new Thread(ticketSell);
		Thread t3 = new Thread(ticketSell);
		Thread t4 = new Thread(ticketSell);
		//Start these threads
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
	
}
//Define the class of sell tickets
class TicketSell implements Runnable{
	private int ticket = 50;//Define the total number of tickets
	public void run(){
		while(true){
			if(ticket>0){
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				String threadName = Thread.currentThread().getName();//Get the name of thread at present
				System.out.println("线程"+threadName+"出售第"+ticket+"张票!");
				ticket--;
			}
		}
	}
}


代码运行结果可自行测试


如上代码体现,run方法被四个线程同时执行时,发生了数据混乱。则说该方法被同步执行出错,即该方法不同步




3.线程安全:


多个线程同时操作同一个数据进行操作时,会产生数据混乱的现象,即线程安全出问题。即如果代码发生同步问题,则 多线程不安全



4.互斥:


为解决上述问题,我们可以使用synchronized修饰需要同步的代码块、方法,达到线程安全的目的。使用synchronized修饰的代码块、方法会出现一个现象,即一个线程执行该方法时,为该方法上锁,其他线程不能执行这个方法指导当前线程执行完该方法。这种多个线程互相排斥执行同一段代码的现象为互斥。