🦛 ThreadLocal
type
status
date
slug
summary
tags
category
icon
password
Property
 
多线程是Java实现多任务的基础,Thread对象代表一个线程,我们可以在代码中调用Thread.currentThread()获取当前线程。例如,打印日志时,可以同时打印出当前线程的名字:
对于多任务,Java标准库提供的线程池可以方便地执行这些任务,同时复用线程。Web应用程序就是典型的多任务应用,每个用户请求页面时,我们都会创建一个任务,类似:
然后,通过线程池去执行这些任务。
观察process()方法,它内部需要调用若干其他方法,同时,我们遇到一个问题:如何在一个线程内传递状态?
process()方法需要传递的状态就是User实例。有的童鞋会想,简单地传入User就可以了:
但是往往一个方法又会调用其他很多方法,这样会导致User传递到所有地方:
这种在一个线程中,横跨若干方法调用,需要传递的对象,我们通常称之为上下文(Context),它是一种状态,可以是用户身份、任务信息等。
HTML概述
type
status
date
slug
summary
tags
category
icon
password
Property
 

什么是HTML?怎么开发HTML?怎么运行HTML?

HTML: Hyper Text Markup Language (超文本标记语言)
由大量的标签组成,每一个标签都有开始标签和结束标签
超文本: 流媒体、图片、声音、视频....
 
HTML开发的时候使用普通的文本编辑器就行,创建的文件扩展名是.html或者.htm HTML也有专业的开发工具,例如:DreamWeaver、HBuilder.....
 
直接采用浏览器打开HTML文件就是运行
 

HTML是谁制定的?

🍁 进一步认识stage窗口,模式,模态
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
 
 
🍁 screen类
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
notion image
 
 
🍁 platform类的使用
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
 
 
🦛 死锁
type
status
date
slug
summary
tags
category
icon
password
Property
 
Java的线程锁是可重入的锁。什么是可重入的锁?
观察synchronized修饰的add()方法,一旦线程执行到add()方法内部,说明它已经获取了当前实例的this锁。如果传入的n < 0,将在add()方法内部调用dec()方法。由于dec()方法也需要获取this锁,现在问题来了:
对同一个线程,能否在获取到锁以后继续获取同一个锁?
答案是肯定的。JVM允许同一个线程重复获取同一个锁,这种能被同一个线程反复获取的锁,就叫做可重入锁。
由于Java的线程锁是可重入锁,所以,获取锁的时候,不但要判断是否是第一次获取,还要记录这是第几次获取。每获取一次锁,记录+1,每退出synchronized块,记录-1,减到0的时候,才会真正释放锁。

死锁

一个线程可以获取一个锁后,再继续获取另一个锁。例如:
在获取多个锁的时候,不同线程获取多个不同对象的锁可能导致死锁。对于上述代码,线程1和线程2如果分别执行add()dec()方法时:
  • 线程1:进入add(),获得lockA
基本语法
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
 
JavaScript每个语句以;结束,语句块用{...}
JavaScript并不强制要求在每个语句的结尾加;,浏览器中负责执行JavaScript代码的引擎会自动在每个语句的结尾补上;
 
🐼 Queue
type
status
date
slug
summary
tags
category
icon
password
Property
 
队列(Queue)是一种经常使用的集合。Queue实际上是实现了一个先进先出(FIFO:First In First Out)的有序表。它和List的区别在于,List可以在任意位置添加和删除元素,而Queue只有两个操作:
  • 把元素添加到队列末尾;
  • 从队列头部取出元素。
超市的收银台就是一个队列:
notion image
在Java的标准库中,队列接口Queue定义了以下几个方法:
  • int size():获取队列长度;
  • boolean add(E)/boolean offer(E):添加元素到队尾;
  • E remove()/E poll():获取队首元素并从队列中删除;
  • E element()/E peek():获取队首元素但并不从队列中删除。
对于具体的实现类,有的Queue有最大队列长度限制,有的Queue没有。注意到添加、删除和获取队列元素总是有两个方法,这是因为在添加或获取元素失败时,这两个方法的行为是不同的。用一个表格总结如下: