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修饰的代码块、方法会出现一个现象,即一个线程执行该方法时,为该方法上锁,其他线程不能执行这个方法指导当前线程执行完该方法。这种多个线程互相排斥执行同一段代码的现象为互斥。