作者小头像 Lv.2
75 成长值

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据
个人勋章
  • 活跃之星
成长雷达
0
60
0
15
0

个人资料

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据

达成规则

发布时间 2021/09/06 09:50:21 最后回复 大卡 2021/11/03 21:04:04 版块 社区活动
7080 134 0
发布时间 2021/09/06 09:50:21 最后回复 大卡 2021/11/03 21:04:04 版块 社区活动
7080 134 0
发布时间 2021/09/06 09:50:21 最后回复 大卡 2021/11/03 21:04:04 版块 社区活动
7080 134 0
发布时间 2021/09/06 09:50:21 最后回复 大卡 2021/11/03 21:04:04 版块 社区活动
7080 134 0
他的回复:
华为云账号:hw1647796330 第五周笔记线程的死锁当一个线程永远地持有一个锁,并且其他线程都尝试去获得这个锁时,那么它们将永远被阻塞。如果线程A持有锁L并且想获得锁M,线程B持有锁M并且想获得锁L,那么这两个线程将永远等待下去,这种情况就是最简单的死锁形式。线程的明锁在java5中,专门提供了锁对象Lock,利用锁可以方便的实现资源的封锁,用来竞争资源并发访问的控制。Lock所有加锁和解锁的方式都是显式的。Lock.lock():获取锁 Lock.unlock()Lock与synchronize对比:1.lock不是java语言内置的,synchronize是java语言的关键字,因此是内置特性。Lock是一个类,通过这个类可以实现同步访问。2.synchronized不需要手动释放锁,当synchronized方法或者synchronized代码执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。Java的ReenTrantLock也就是用队列实现的公平锁和非公平锁在公平的锁中,如果有另一个线程持有或者有其他线程在等待队列中等待这个线程,那么新发出的请求的线程将被放入到队列中。而非公平锁上,只有当被某个线程持有时,新发出的线程才会被放入队列中,(此时和公平锁是一样的)所以二者的差别在于非公平锁会有更多的机会去抢占锁。线程通信机制线程间同步可以归纳为线程间通信的一个子集,对于线程通信指的是两个线程之间可以交换一些实时的数据信息。线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体,线程间的通信就成为整体的必用方式之一。当线程存在通信指挥,系统间的交互性会更强大,在提高CPU利用率的同时还会使开发人员对线程任务在处理过程中进行有效的把控与监督。wait/notify方法实现线程间的通信:    1.等待/通知机制,是指线程A调用了对象的wait()方法进入等待状态,而线程B调用了对象的notify()或notifyall方法,线程A收到通知后退出等待队列,进入可运行状态,进而知心后续操作。    2.从功能上来说wait就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠。直到有其他线程调用对象的notify唤醒该线程,才能继续获取对象锁,并继续执行。    3.wait和notify方法是Object类的方法Lock和Condition通信机制    1.Lock用于控制多线程对需要竞争的贡献资源的顺序访问,保证该状态的连续性。    2.Condition是java提供的来实现等待/通知的类,condition对象是由Lock对象所创建的。    3.condition中的await方法相当于Object的wait方法,condition中的signal方法相当于object的notify方法。线程的ThreadLocal本地缓存对象ThreadLocal线程范围内的共享变量:    线程范围内的共享变量,每个线程只能访问自己的数据,不能访问别的线程数据。每个线程调用全局ThreadLocal对象的set方法,就相当于往其内部的map中增加一条记录,可以分别是各自的线程,value是各自的set方法穿进去的值。线程的volatile关键字volatile挂你尖子可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可见性。volatile的作用:使变量在多个线程间可见,但是无法保证原子性。    需要注意的是一般volatile用于只针对多个线程可见的变量操作,并不能代替synchronize的同步功能。线程池的作用:   1.降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗    2.提高影响速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。    3.提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会减低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。线程池的应用:    场景:请求频繁,考虑到服务的并发问题,如果每个请求来到后,服务都为它启动一个线程,那么这对服务的资源可能会造成很大的浪费。线程的同步工具类CountDownLatch同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。    1.CountDownLatch类是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用countDown方法,计数器减一,计数器大于0时,await方法会阻塞程序继续执行。    2.由于调用了countDown方法,所以在当前计数到大零之前,await方法会一直受阻塞。之后,会释放所有等待的线程,await的所有后续调用都将立即返回。这种现象只出现一次,计数无法被重置。一个线程或者多个,等待另外N个线程完成某个事情之后才能执行。CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点。因为该barrier在释放等待线程后可以重用,所以称它为循环的barrier。Semaphore是一个计数信号量,他的本质是一个共享锁,是基于AQS实现的,通过state变量来实现共享。通过调用acquire方法,对state值减去一,当调用release的时候,对state值加一。当state变量小于0的时候,在AQS队列中阻塞等待。Exchanger是一个用于线程间协作的工具类,Exchanger用于进行线程间的数据交换;它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据;这两个线程通过exchange交换数据。如果第一个线程先执行exchange,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。线程的fork/join机制fork/join框架是java7提供一个用于并执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。分治法:把一个规模大的问题划分为规模较小的子问题,然后分而治之,最后合并子问题的解得到原问题的解。synchronize和volatile区别:    1.volatile关键字解决的是变量在多个线程之间的可见性;而synchronize关键字解决的是多个线程之间访问共享资源的同步性。    2.volatile只能用于修饰变量,而synchronize可以修饰方法,以及代码块    3.多线程访问volatile不会发生阻塞,而synchronize会出现阻塞。    4.volatile能保证变量在多个线程直接爱你的可见性,但不能保证原子性;而synchronize可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公有内存中的数据做同步。synchronize和Lock区别:    1.Lock是一个接口,而synchronize是java中的关键字,synchronize是内置的语言实现。    2.synchronize在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock去释放锁,则很可能造成死锁现象,因此时使Lock时需要在finally块中释放锁。    3.Lock可以提高多个线程进行读操作的效率(读写锁)。线程的读写分离机制ReadWriteLock顾名思义是读写锁,它维护了一对相关的锁“读取锁”和“写入锁”,一个用于读取操作,另一个用于写入操作。读取所用于只读操作,它是共享锁,能同时被多个线程获取。写入锁用于写入操作,它是独占锁,写入锁只能被一个线程获取。不能同时存在读取锁和写入锁,可以读-读,但不能读-写,写-写。
发布时间 2021/09/06 09:50:21 最后回复 大卡 2021/11/03 21:04:04 版块 社区活动
7080 134 0
他的回复:
华为云账号:hw1647796330 第四周笔记进程和线程进程:是并发执行程序在执行过程中资源分配和管理的基本单位。线程:是进程的一个执行单元,是进程内可调度的实体,是比进程更小的独立运行的基本单位,也被称为轻量进程。创建线程的五种方式继承Thread类:    通过继承Thread并且重写其run(),run方法中定义需要执行的任务。    创建后的子类通过调用start方法即可执行线程方法。通过继承Thread是想的线程类,多个线程之间无法共享线程的实例变量,需要创建不同Thread对象,自然不共享资源。实现Runnable接口:    需要先定义一个类实现Runnable接口并重写该接口的run方法,此run方法是线程执行体。接着创建Runnable实现类的对象,作为创建Thread对象的参数target,次Thread对象才是真正的线程对象。利用实现Runnable接口的线程类创建对象,可以实现线程之间的共享资源。实现Callable接口实现带有返回值的线程:    Callable接口如同Runnable接口的升级版,其提供的call方法将作为线程的执行体,同时允许有返回值,Callable对象不能直接作为Thread对象的target,因为Callable接口是JAVA5新增的接口,不是Runnable接口的子接口。对于如此,引入Future接口,此接口可以接受call的返回值,RunnableFuture接口是Future接口和Runnable接口的子接口,可以作为Thread对象的target。继承TimerTask:    Timer和TimerTask可以作为实现线程的另一种方式,Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。还是一个抽象类,实现了Runnable接口,所以具备类多线程的能力。通过线程池启动多线程:    通过Executors的工具类可以创建线程池。提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行。降低系统资源消耗,通过重用已存在的线程, 降低线程和销毁造成的消耗。方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换。Thread和Runnable接口的区别    实现Runnable接口避免多继承局限,可以更好的体现共享的概念,是Thread类的父类。线程的优先级Java线程的优先级范围是1-10,默认优先级是5,10最高线程的优先级仍然无法保障线程的执行次序优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行主线程的优先级是5接口同步回调和异步回调同步调用:一种阻塞式调用,调用要等待对方执行完毕才返回,是一种单向调用。回调:一种双向调用模式,被调用方在接口被调用时也会调用对方的接口异步调用:一种类似消息或者事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或者发生某种事件时,会主动通知客户方。线程的生命周期在线程的生命周期中,它要经过新建,就绪,运行,阻塞和死亡5种状态当线程启动多次以后,他不可能一直霸占着CPU独自运行,所以CPU需要在多条线程之间切换,于世线程状态也会多次运行、阻塞之间切换。线程的生命周期五个阶段:1.新建状态,当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时仅由JVM为其分配内存,并初始化成员变量的值。2.就绪状态,当线程对象调用了start方法之后,该线程处于就绪状态。Java虚拟机会为其创建方法调用栈和程序计数器,等待调度运行。3.运行状态,如果处于就绪状态的线程获得了CPU,开始执行run方法的线程执行体,则该线程处于运行态。4.阻塞状态,当处于运行状态的线程失去所占用资源之后,便进入阻塞状态。5.在线程的生命周期中,线程的各种状态在转换过程。线程的睡眠线程休眠的方法是Thread.sleep(long)。线程休眠的目的是使线程让出CPU的最简单的做法之一,线程休眠的时候会将CPU资源交给其他线程,以便乱换执行,当休眠一定时间后,线程会苏醒进入准备状态等待执行。线程的让步Yield的作用是让步,它能让当前线程由“运行状态”进入到“就绪状态”,从而让其他具有相同优先级的等待线程获取执行权。但是,并不能保证在当前线程调用yield之后,其他具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行。线程的合并线程的合并的作用就是将几个并行线程合并为一个单线程执行。当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法守护线程调用线程对象的方法setDeamon(true),则可以将其设置为守护线程JVM的垃圾回收、内存管理等线程都是守护线程setDeamon(boolea on):将该线程标记为守护线程或用户线程当正在运行的线程都是守护线程时,java虚拟机推出线程的中断和死亡线程中断就是让目标线程停止执行,但它不会使线程立即终止,而是给线程发送一个通知,告诉线程jvm希望推出执行,至于目标线程何时退出,则由其决定。线程会以如下三种方式结束,结束后就处于死亡状态。    1、run或call方法执行完成,线程正常结束    2、线程抛出一个未捕获的Exception或Error。    3、直接调用该线程的stop方法结束该线程—容易导致死锁线程的同步和安全线程安全问题:    设计并发编程的目的是为了使程序获得更高的执行效率,但绝不能出现数据一致性的问题。   如果并发程序连基本的执行结果准确性都无法保证,那并发编程就没有意义。为什么会出现数据不正确:    如果一个资源(变量、对象、文件、数据库)可以同时被很多线程使用就会出现数据不一致问题,也就是我们说的线程安全问题。这样的资源被称为共享资源或临界区。线程的同步安全互斥访问之synchronized:    互斥锁:顾名思义就是互斥访问目的的锁    如果对临界资源加上互斥锁,当一个线程在访问临界资源时,其他线程便只能等待。在java中,每一个对象都拥有一个锁标记,也称为监视器,多线程同时访问某个对象时,只有拥有该对象锁的线程才能访问。同步代码块:    同步块的根本目的,是控制竞争资源的正确的安全访问,因此只要在访问竞争资源的时候保证同一时刻,只能一个线程访问即可,所以引入了同步代码块的策略,以提高性能。    Obj叫做同步监视器(即锁对象),任何线程进入下面同步代码块之前必须先获得对ibj的锁;其他线程无法获得锁。    锁对象可以是任意对象,但必须保证是同一对象任何时刻只能有一个线程可以获得对同步监视器的锁定。当同步代码块执行完成后该线程会释放对该同步监视器的锁定
发布时间 2021/09/06 09:50:21 最后回复 大卡 2021/11/03 21:04:04 版块 社区活动
7080 134 0
他的回复:
华为云账号:hw1647796330   第三周笔记从功能上来讲,爬虫一般分为数据采集,处理,存储三个部分。Elements提供了一系列类似于DOM的方法来提取和操作他们的数据:-id():从元素中获取id-className():从元素中获取className-attr(String str):从元素中获取属性str的值-attributes():从元素中获取所有属性attributes-text():从元素中获取文本内容 Jsoup:JSoup是一个用于处理HTML的Java库,它提供了一个非常方便类似于使用DOM,CSS和jquery的方法的API来提取和操作数据。jsoup实现WHATWG HTML5规范,并将HTML解析为与现代浏览器相同的DOM。从URL,文件或字符串中提取并解析HTML。查找和提取数据,使用DOM遍历或CSS选择器。操纵HTML元素,属性和文本。根据安全的白名单清理用户提交的内容,以防止XSS攻击。输出整洁的HTML。 使用DOM方法导航文档元素提供了一系列类似DOM的方法来查找元素,并提取和操作它们的数据。DOM getter是上下文的:在父文档上调用,他们在文档下找到匹配的元素; 他们在一个子元素上调用了那个孩子下面的元素。通过这种方式,您可以了解所需的数据。 getElementById(String id)getElementsByTag(String tag)getElementsByClass(String className)getElementsByAttribute(String key) (及相关方法)元素的兄弟姐妹:siblingElements(),firstElementSibling(),lastElementSibling(),nextElementSibling(),previousElementSibling() 处理元素数据 attr(String key)获取和attr(String key, String value)设置属性attributes() 获得所有属性id(),className()和classNames()text()获取和text(String value)设置文本内容html()获取和html(String value)设置内部HTML内容outerHtml() 获取外部HTML值data()获取数据内容(例如script和style标签)tag() 和 tagName()  操纵HTML和文本append(String html), prepend(String html)appendText(String text), prependText(String text)appendElement(String tagName), prependElement(String tagName)html(String value)