进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
单线程程序:即,若有多个任务只能依次执行。当上一个任务执行结束后,下一个任务开始执行。
多线程程序:即,若有多个任务可以同时执行。
在多线程的运行过程中,由于不同线程对同一个数据对象的访问时容易对数据造成破坏。故,应该通过在某个时刻只允许一个线程能够独立性 访问共享数据的机制,就可以解决线程的安全问题。具体做法是:当一个线程进入共享数据操作代码时,其他想进入共享数据操作的代码就一直处于等待状态,在具有独占性权限的代码操作完成后,才允许另外一个线程进入贡献数据操作代码,其他的线程继续等待,这个过程称为线程的同步。
实现线程的同步的方法有两种:1、使用关键字synchronized修饰要同步的方法;2、将要同步的代码放入synchronized块中
使用关键字synchronized修饰要同步的方法
public class Main {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket, "窗口1").start();
new Thread(ticket, "窗口2").start();
new Thread(ticket, "窗口3").start();
}
}
// 使用关键字synchronized修饰要同步的方法
class Ticket implements Runnable {
int ticket = 10;
public synchronized void run() {
while (true) {
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在售票:"
+ ticket--);
}
}
}
}
将要同步的代码放入synchronized块中
public class Main {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket, "窗口1").start();
new Thread(ticket, "窗口2").start();
new Thread(ticket, "窗口3").start();
}
}
// 将要同步的代码放入synchronized块中
class Ticket implements Runnable {
int ticket = 10;
public void run() {
synchronized (this) {
while (true) {
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "正在售票:" + ticket--);
}
}
}
}
}