ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022-08-02 day20 第一小组 王鸣赫

2022-08-03 22:01:46  阅读:216  来源: 互联网

标签:02 状态 缓存 08 day20 线程 内存 多线程 CPU


目录

线程

1.什么是线程与进程

1:进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。
2:线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
3:简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程

2.多线程编程

1.创建多线程

初学Java多线程编程的时候,需要掌握两种创建多线程的方法:

声明一个Thread类的子类,子类中重写Thread类的run方法。
声明一个实现Runnable接口的类,类中实现run方法。

点击查看代码
public class ThreadTest {

    public static void main(String[] args) {

        MyThread t1 = new MyThread();
        MyThreadRunnable target = new MyThreadRunnable();
        Thread t2 = new Thread(target);

        //启动线程1
        t1.start();
        //启动线程2
        t2.start();

    }

}

//创建线程方式一
class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println("方式一-->" + i);
        }
    }
}

//创建线程方式二
class MyThreadRunnable implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println("方式二-->" + i);
        }
    }
}
2、线程状态

1. 初始状态(NEW)

实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了初始状态。

2.1. 就绪状态(RUNNABLE之READY)
就绪状态只是说你资格运行,调度程序没有挑选到你,你就永远是就绪状态。
调用线程的start()方法,此线程进入就绪状态。
当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态。
当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入就绪状态。
锁池里的线程拿到对象锁后,进入就绪状态。

2.2. 运行中状态(RUNNABLE之RUNNING)
线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一的一种方式。

3. 阻塞状态(BLOCKED)

阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态。

4. 等待(WAITING)

处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。

5. 超时等待(TIMED_WAITING)

处于这种状态的线程不会被分配CPU执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒。

6. 终止状态(TERMINATED)

当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它终止了。这个线程对象也许是活的,但是它已经不是一个单独执行的线程。线程一旦终止了,就不能复生。
在一个终止的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

CPU

CPU多核缓存结构

物理内存:硬盘内存。(固态硬盘,尽量不要选择混合硬盘)

CPU缓存为了提高程序运行的性能,现在CPU在很多方面对程序进行优化。
CPU处理速度最快,内存次之,硬盘速度最低。
在CPU处理内存数据时,如果内存运行速度太慢,就会拖累CPU的速度
为了解决这样的问题,CPU设计了多级缓存策略。

CPU分为三级缓存:每个CPU都有L1,L2缓存,但是L3缓存是多核公用的。

CPU查找数据时,CPU->l1->l2->l3->内存->硬盘
进一步优化,CPU每次读取一个数据,读取的时与它相邻的64个字节的数据。
【缓存行】。

英特尔提出了一个协议MESI协议

1、修改态,此缓存被动过,内容与主内存中不同,为此缓存专有
2、专有态,此缓存与主内存一致,但是其他CPU中没有
3、共享态,此缓存与主内存一致,其他的缓存也有
4、无效态,此缓存无效,需要从主内存中重新读取

线程安全的实现方法

(1)数据不可变。一切不可变的对象一定是线程安全的。对象的方法的实现方法的调用者,不需要再 进行任何的线程安全的保障措施。比如final关键字修饰的基本数据类型,字符串。
只要一个不可变的对象被正确的创建出来,那外部的可见状态永远都不会改变。
(2)互斥同步。加锁。【悲观锁】
(3)非阻塞同步。【无锁编程】,自旋。我们会用cas来实现这种非阻塞同步。
(4)无同步方案。多个线程需要共享数据,但是这些数据又可以在单独的线程中计算,得出结果

标签:02,状态,缓存,08,day20,线程,内存,多线程,CPU
来源: https://www.cnblogs.com/wmh19990109/p/16545393.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有