并发杂记

并行:同时执行,不会打扰到彼此,每一个任务都有自己的时间片。

并发:上下文切换,CPU时间片只有能一个。

高并发:某一时刻(小时,分钟,秒,天)大量请求到来。

Java对并发的支持: 

                                线程,比进程轻,如果要创建更多的线程,可以在启动程序时指定单个线程大小,对于操作系统来说,一个线程是一个完成的执行单元,仍属于JVM进程,JVM进程中JMM对于线程来说都是共享的,每个线程都可以独立调度,而且有自己的栈和程序计数器,但会和同个进程中的其他线程共享内存和对象。

  e.g:

        Runnable th =()->{
            System.out.println(Thread.currentThread().getName());
        };
        Thread th2 = new Thread(){
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName());
            }
        };
       Thread th2 = new Thread(()->{
            System.out.println(Thread.currentThread().getName());
        });

线程生命周期:

                     NEW 已经创建没有调用start方法。

                     RUNNABLE 线程正在运行,或当前操作系统调度线程时可以运行。

                    BLOCKED 线程中止运行,等待获得一个锁,以便进入临界区。

                    WAITING 线程中止运行,临界区中调用了wait或join。

                   TIMD_WAITING 线程中止运行,调用了sleep或wait,join 并传入了超时时间。

                   TERMINATED 线程执行完毕,线程对象的run() 方法正常退出,或抛出异常。

线程的可见性:

      每一个线程都有自己的栈,但是都引用了相同的堆,因此可以轻易的共享内存对象,只是把从一个线程传到另外一个线程。

由此可见,对象是默认可见的。

对象是默认可变的(对象的内容),

final关键字可以把变量或引用生命为常量,但这种字段不属于对象的内容。

并发编程的安全性:

                        在一个程序中,不管调用什么方法,也不管操作系统如何调度应用线程,一个对象看到任何其他对象都不处于非法或不一致状态,这样的程序才称的上是安全的多线程程序。

安全的面向对象程序: 通过调用对象的存取方法,把对象从一个合法状态变成另一个合法状态。

安全性:

           互斥: 只要修改或读取对象过程中,对象的状态可能不一致,这段代码可能就要受到保护,synchronized,

java平台会为它创建的每个对象纪录一个特殊的标记,这个标记叫做监视器,synchronized使用这些监视器指明,

synchronized 修饰的代码块或方法会发生一系列事件,详述如下:


(1) 线程需要修改对象时,会临时把对象变成不一致状态;
(2) 线程获取监视器,指明它需要临时互斥存储这个对象;
(3) 线程修改对象,修改完毕后对象处于一致的合法状态;
(4) 线程释放监视器。

如果在修改对象的过程中,其他线程尝试获取锁,Java 会阻塞这次尝试,直到拥有锁的线
程释放锁为止。
安全性:

              可见性 volatile ,用于并发访问数据,线程退出标志位,double check,该关键字指明,在使用字段或者变量前必须从主内存中读,写的时候也必须存回主内存,也避免了重排序。

private volatile boolean shutdown = false;
public void shutdown() {
   
 shutdown = true;
    
   }
    public void run() {
    while (!shutdown) {

        }
    }

同步是为了保护对象的状态和内存,而不是代码。

同步是线程间协助机制,一个缺陷就可能破坏这种协助模型,导致严重的后果。

获取监视器只能避免其他线程再次获取这个监视器,而不能保护对象。

即便对象的监视器锁定了,不同步的方法也能看到(和修改)不一致的状态。

锁定Objectp[] 不会锁定其中的单个对象。

基本类型的值不可变,因此不能锁定。

接口中声明的方法不能用synchronized修饰。

内部类只是语法糖,因此内部类的锁对外层类无效,反过来也是如此。

Java的锁可重入,意味着如果一个线程拥有一个监视器,这个线程遇到具有同一个监视器的同步代码块时,可以进入这个代码块。

Java 的线程模型基于三个基本概念。
            • 状态是共享的,可变的,而且默认可见
                     意思是,在同一个进程中,对象可在不同的线程间轻易共享,而且只要线程中有对象的
引用,就可以修改对象。
              • 抢先式线程调度
                           几乎任何时候,操作系统的线程调度程序都能把线程调入和调出内核。
              • 对象的状态只能由锁保护
                                锁很难正确使用,而且状态十分脆弱,即便是读取操作也可能会得到不可思议的结果。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值