进程,线程学习记录

线程高级学习记录二

cpu时间片轮转机制

每个进程被分配一个时间段称作为时间片,称作它的时间片,即该进程允许运行的时间。进程在时间片结束前阻塞或者结束,则cpu当即进行切换。当进程用完它的时间后,它被移动到队列的末尾。
进程调度程序要做的就是维护一张就绪进程列表。当进程用完它的时间片后,它被移到队列的末尾
时间片轮转调度唯一有趣的一点是时间片的长度。从一个进程切换到另外一个进程是需要一定时间的。包括保存和装入寄存器的值及内存映像。更新各种表格和队列

进程

操作系统进行资源分配的最小单位, 其中的资源包括:cpu,内存空间,磁盘,io等。同一进程中的多条线程共享该进程中的全部系统资源。
进程分为系统进程和用户进程。系统进程:用于完成操作系统的各种功能的进程

并发:linux可以通过多进程实现并发操作
操作系统中的进程问题
python:提供多线程和多进程的类库
java:只提供了多线程的类库

寄存器

存储二进制代码,具有存储功能的触发器组合起来构成的
超线程技术:一个核心可以同时2个线程

cpu从内存中读取数据的顺序优先级是:寄存器–>,高速缓存–>,内存

寄存器:存储二进制代码,具有存储功能的触发器组合起来构成的
超线程技术:一个核心可以同时2个线程

cpu从内存中读取数据的顺序优先级是:寄存器–>,高速缓存–>,内存

寄存器:存储二进制代码,具有存储功能的触发器组合起来构成的
超线程技术:一个核心可以同时2个线程

并行运行可以简单如下理解:
1.程序所开启的正在运行的线程数<=cpu数量核心数
2.程序所开启的正在运行的线程数<=cpu数量
线程数

一台计算机有多个cpu或者一个cpu有多个核和线程:当进程产生的总线程数小于cpu的核数,则不同进程的线程可以分配给不同的cpu来运行(称之为并行),这个时候
进程会同时运行(两个线程互不抢占CPU资源,可以同时进行)如果进程分配的线程数大于cpu的核心线程数,则这个时候就要使用并发技术。

并发运行:单位时间内并发量:
可以简单理解为:
1.程序同时开启的运行中的线程数>cpu数量cpu的核心数量
2.程序同时开启的运行中的线程数>cpu数量
cpu的线程数量

一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理及上运行

分布式计算研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理

中断子线程的while循环的方法:

方法一:
1.在父线程中调用 subthread.interrupt();
2.在while循环中 判断isInterrupted()的值。为true时break;
方法二:
1.在父线程中调用 subthread.interrupt();
2.在循环中增加阻塞
try{
Thread.sleep(3L);
}catch(InterruptedException e){
break;
}

线程的5中状态

1.新建(new thread)
2.就绪(starting)
3.运行(running)
4.堵塞(blocked)
可以用sleeping(long time)
wait()等待方法, 可以调用notify()方法回到就绪状态
被另一个线程所阻塞:调用suspend()方法。 可以调用resume()方法进行恢复
5.死亡(dead)
自然终止:正常运行run()方法后终止
异常死亡:调用stop()方法后让一个线程终止

yied():可以对当前线程进行临时暂停,让出cpu的使用权
wait()方法必须在 synchronized blok中调用。

守护线程

可以理解为后台运行线程。进程结束时,守护线程自然而然的就会结束。

拥有相同的对象锁是什么意思

ThreadLocal

ThreadLocal为=每个使用该变量的线程提供独立的变量副本

线程安全

java 内存模型:jmm (java memory model) jmm规定 主内存(java堆内存:存放类实列,静态数据等变量,多个线程共享)
工作内存:从主内存中拷过来的变量以及访问方法所取得的局部变量 ,每个线程私有的其他线程不能访问

线程之间的通信:通过共享变量,jMM中主内存是国歌线程共享的。

线程可见性问题:线程的工作内存归属单个线程所有,其他线程不可见
时序性问题:线程在引用变量时,会从主内存中拷贝一个副本到工作内存(read-load)完成后线程会引用该副本。当同一线程再度引用
该字段时,有可能重新从主内存中获取变量副本(read-load-use),也有可能直接引用原来的副本。也就是说 read load use顺序可以由
JVM实现系统决定。

实现线程安全的三种方法:

1.多实列,不再用单例模式
2.使用java.util.concurrent下面的类库
3.使用锁机制synchronized,look方式

synchronized

(同步锁,隐式锁) 用来修饰一个方法或者一个代码块的时候,能够保证再同一时刻最多只有一个线程执行该段代码
隐式锁不需要执行加锁,解锁的操作

隐式规则:
当两个并发线程访问同一个对象的 synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另外一个线程必须等待当前线程执行完该代码块才能执行
当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中非synchronized(this)同步代码块
当一个线程访问object 的一个synchronized(this)同步代码块时,其他线程对object中所有其他synchronized(this)同步代码块的访问将被阻塞

在性能和执行效率方面:
同步方法体public synchronized void synMethod(){} < 方法锁 synMethod(int a1){ synchronized(this){}}

显示锁有 Lock(interface) implementClass ReentrantLock,ReentrantReadWriteLock.ReadLock,ReentrantReadWriteLock.WriteLock
在这里插入图片描述
ReentrantLock 有许多优点,是工作中对方法块加锁使用频率最高的
但是有一个主要缺点:
可能忘记释放锁定

读写锁(ReentrantReadWriteLock)
读-读不互斥
读-写互斥
写-写互斥

StampedLock
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据的完整性
读取乐观锁:在读取之前不需要来判断 数据的一致性,只读取自己的就好了。

悲观锁:假设会发生并发冲突,屏蔽一切可能违反数据完整性的操作
悲观锁读取:读之前判断下数据有没有正在被更改

valatile:说这个变量是易变的,不稳定的。告诉编译器不要对该变量使用缓存等优化机制。应该每次都从它的内存地址中去读取值
使用volatile标记的变量在读取或写入时不需要使用锁,

注意:每次读取volatile的变量时都从内存地址中读取,并没有说每次修改完之后都要将它的值写回内存。所以用这个关键字做高并发的安全机制是不可靠的。

适用场景:只有一个线程修改变量,多个线程读取变量的地方。

(原子操作)atomic 高并发情况下的高效程序
处理类有:
AtomicInteger,AtomicLong,AtomicBoolean 等等。

单例模式
//线程安全,性能不是很高

public class Singleton{
    private static Singleton instance;
    private Singleton(){
    }
    public static synchronized Singleton getInstance(){
        if(instance ==null){
            instance=new Singleton();
        }
        return instance;
    }
}

//线程安全,性能高

public class Singleton{
    private static Singleton instance;
    private static byte[] lock=new byte[0];
    private Singleton(){
    }
    public static Singleton getInstance(){
        if(instance ==null){
            synchronized(lock){
			  if(instance ==null){
                instance=new Singleton(); 
				}
            }
        }
        return instance;
    }
}

//线程安全,常见写法

public class Singleton{
    private static Singleton instance;
    private static ReentrantLock lock=new ReentrantLock();

    private Singleton(){
    }
    public static  Singleton getInstance(){
        if(instance ==null){
            lock.lock();
            if(instance ==null){
            instance=new Singleton();
           }
        lock.unlock();
        }
        return instance;
    }
}

操作系统中的
堆内存允许程序在运行时动态的申请某个大小的内存空间
优先队列:一种满足堆内存性质的数据结构,一颗完全二叉树

栈:一种先进后出的数据结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值