程序、进程、线程

1.程序、进程、线程简述 程序的基本概念 程序是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。 进程的基本概念 在多道程序环境下,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性及不可再现性的特征。为此引入了进程(Process) 的概念,以便更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性(最基本的两个特性)。 为了使参与并发执行的程序(…

并行、并发

单核CPU 和多核CPU 的理解 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务。例如:虽然有多车道,但是收费站只有一个工作人员在收费,只有收了费才能通过,那么CPU就好比收费人员。如果有某个人不想交钱,那么收费人员可以把他“挂起”(晾着他,等他想通了,准备好了钱,再去收费)。但是因为CPU时间单元特别短,因此感觉不出来。 如果是多核的话,才能更好的发挥多线程的效…

线程生命周期

线程生命周期 JDK中用Thread.State类定义了线程的几种状态。要想实现多线程,必须在主线程中创建新的线程对象。Java语言使用Thread类及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如下的 五种状态: 新建: 当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态 就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它…

线程的创建与使用

在Java中,创建多线程有多种方式,JDK1.5之前,有两种创建线程的方式: 继承Thread 实现Runnable接口 JDK1.5之后有新增了两种创建多线程的方式: 实现Callable 使用线程池 Thread Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run()方法的主体称为 线程体 通过该Thread对象的start()方法来启动这…

线程之间的通信

wait() 与 notify() 和 notifyAll() wait():令当前线程挂起并放弃CPU、同步资源并等待,使别的线程可访问并修改共享资源,而当前线程排队等候其他线程调用notify()或notifyAll()方法唤醒,唤醒后等待重新获得对监视器的所有权后才能继续执行。 notify():唤醒正在排队等待同步资源的线程中优先级最高者结束等待 notifyAll ():唤醒正在排队等待…

线程安全问题及解决办法

JDK5.0之前就已经有了两种解决线程安全的问题: 同步代码块 同步方法 JDK5.0后新增了一种解决方案: 同步锁 同步的方法虽然能解决线程安全问题,但它带来的坏处就是降低了效率。所以,我们应该尽量减少需要同步的代码块,必不可少的地方才去用同步方法。 我们首先分别用继承Thread以及实现Runnable接口的方法,写出一个含线程安全的程序。 模拟业务:多窗口卖票(使用多线程模拟多个窗口),共有…

线程安全的懒汉单例模式

在Java中,单例模式分为饿汉式和懒汉式。默认情况下,懒汉式是线程不安全的,懒汉式代码如下: class Singleton { private static Singleton instance = null; private Singleton() { } public static Singleton getInstance () throws InterruptedException { …

发什么出现死锁

不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁。 举个例子:假如业务A模块拿到了A锁,需要拿到B锁后才能继续向下执行;另外业务B模块拿到了B锁,需要拿到A锁后才能继续向下执行。这个时候,如果它们都拿着手中的锁不放,指望对方释放锁的话,就会一直僵持下去,形成死锁。 出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继续向下执…