java基本知识的第五天

 

 

 大写的话,就是相当于不匹配相应的内容

这里说的是搜索和替换、说这个正则表达式如何去匹配,以及字符串如何去切分的问题。这里的话,就是说如何去匹配相应的东西,如何去切分相应的东西,相应的替换自己也知道。

 

 

以下讲的是加密和解密

 

 

 

这里应该说的是: URLEncoder和decoder的作用,就是把文本转化为编码,它是不能够用于加密和解密的,只是用来把文本变成编码而已

把文本变成编码 然后供浏览器和服务器处理

 

 

这里说的是:  编码的用处,把任何长度的二进制变为纯文本,

就是说这两个类的不同的地方在这,就是说base64和其他编码的区别

 

 

1.java里面有哈希函数,就是说字符串.hashCode可以作为哈希函数

2.相同的输入,应该得到相同的输出,

不同的输入,要有不同的输出,不然就叫做哈希碰撞

一般我觉得是不是直接用里面的hashcode函数就行了呢

 然后其中一些加密算法就不用说,就是说非对称加密,就是用来传输密钥的,就是说把自己的公钥给到别人,然后的话生成私钥,并且比对私钥是否和公钥相等。

然后数字证书的话,就是说集合了多种东西于一身的一个整数,包括加密、解密等

 

下面讲的是线程:

 

 

 

这里说的是进程和线程,一个进程里面可以包含多个线程的

然后的话进程之间的通信是更复杂一些的

 

 

 

这里的意思是:

如果说在一个线程里面,写x.join 那么意思是它在等待x的结束中

而另外一件事情,就是说:如果写了interrupt 不管你在做什么,都一定会interrupt

 

 

这里的意思是:

1.不同线程之间,共享同一个副本变量的话,这个变量必须写成是 volatile

2.t.interrupt的话,那么必须在这个函数里面写throws InterruptedException  如果它提示你需要抛出异常,那么你就抛出把

3.在java里面是用小写的

 

 

 

这里说的是:volatile关键字的作用是什么:表示这个变量做完之后自动就写回去

保证的是每个变量都拿到同一个变量的值

记住这个图里面怎么读写的

 

 

这里的话,说的是线程,如果说你想要有一个东西守护它,让它自动关闭的话,那么就是用setDaemon

 

 

这里说的是:线程需要同步的原因:对于同一个变量进行读写的时候,需要保证数据的一致性,那么线程就需要同步了

 

 

这里说的是:同步的代码块,需要用synchronized关键字来锁住,锁住这部分代码块=一次只能有一个线程来使用

而这个Main线程为什么去join呢?因为main也作为一个线程,那么的话它要等待别人完毕了之后它再去打印出来,这才比较对

把相应的位置给锁起来就行了。

synchronized的部分,意思是需要钥匙才能打开这部分的内容

而每次只能有一个线程拿到钥匙,并且结束之后再返回钥匙,让别人拿到

懂得这两点就已经可以理解Synchronized了

 

 这个意思是两个锁  锁住同一个变量

那么的话,每个线程可以打开其中一个锁,但是另外一个线程同样可以打开另外一个锁

 

 

 

这里的意思是说:对于一个共享变量,需要一个锁。

不同的共享变量需要不同的锁,相同的共享变量就用同一个锁就可以了

 

 

对于锁这种东西的话,就是你自己去新生成一个类,然后的话把里面的东西作为 锁

然后静态变量就是在你同步的时候就开始赋值的 这是一定的

对于这个同步的话,意思是说 它在访问的时候,就不允许其他的访问了,我认为是降低了效率的,因为的话本来多线程就是要同时来处理,那么确实是降低了效率

 

 

 

因为jvm里面已经有了默认的这个原子操作了,所以说你就不需要再去写同步的代码

而这个如果是多行的赋值 那么还需要同步

引用的话,那么就是原子操作来的

多行的赋值需要同步

 

 

这里想说的是:一般不是说新写一个类,然后的话用这个类的对象去锁   这样不太方便

像刚刚那个Counter的类不就是这样吗

现在就是说:去锁住this对象,那么的话就是对于这个东西的一个锁,不是对全盘的一个锁  对于其他的实例也不会影响

所以一般去锁this对象,就是在这个加法里面去锁this对象

 

 这里说的就是如何变成同步的锁,就是说public synchronized 然后去修饰函数的名字

 

 

也是在这个核心代码前面去加synchronized对象

 

这里说的是  你synchronized这个整个对象和这个synchronized 这个方法是一样的

 

 

 这个是说synchronized这个东西 如果修饰的是一个类,那么就是对于整个类来说的方法

 

 

 

这个方法都去用synchronized来修饰,那么这个方法就是同步的块

 

 

 

这里说的是可重入锁,可重入锁是啥意思?就是说获得了一个锁还能再继续获得

也就是说,我这把锁的钥匙已经获得了之后

这个的意思是说:死锁怎么去看呢

进去一个地方,那么就已经拿了这个钥匙打开这个锁

其他的人不能拿钥匙打开这个锁

然后循环等待的意思就是说:我持有一个锁的钥匙,并且等待另外一个锁的钥匙

这里的话,死锁的概念我懂,但是不太懂的是:为什么要用两个锁来锁东西呢?

 

 

 这里讲的是关于this锁的一些问题

(1)如果对于方法来进行同步,那么就是拿到的是this锁

(2)如果进入了同步代码块,并且是同步的方法,那么意思是:this锁被他拿走了

(3)那么的话确实是存在这个this锁拿了,其他的不能添加的这个问题

(4)wait方法会暂时地释放锁,让其他的对象去拿到这个锁

 

 

这里想说的就是:一个东西是wait  一个东西是notify  notify的意思是说通知已经在等待的进程

 

wait会暂时返回锁,而notify通知wait的进程记得去拿锁

 

 

这里说的是:

ReentrantLock可以去取代synchronized这个关键字来获得锁

然后的话和synchronized不同的是,这个是lock.lock以及lock.unlock()

这个锁比synchronized更好的地方在于,可以用    lock.tryLock来尝试获得锁,如果没获得的话,那么就是可以让它返回 就不用死锁了

 

 

1.queue这种队列,是通过这个LinkedList可以实现  在这个java里面没有stack这种东西,就是只有queue这样的结构

2.这个意思是说,那个线程里面的wait之类的东西,就是用Condition.await之类的来代替

3.所以说ReentranLock和这个Condition搭配,能够比较好的替换synchronized

 

 

这个东西说的是读写锁,读的时候允许读,读的时候不允许写

 

 

这里说的就是:如果读的话,就是读锁去加

如果写的话,就是写锁去加

其中读锁可以被重复地拿取

 

 

这里说的是:读锁、写锁  就是说读的时候 允许读 但是不允许写,这是常规的悲观读锁

然而这个乐观读的话,就是预判读的时候大概率是不可能写的了

那么就是乐观读锁,乐观读锁允许:在读的时候去写是可以的,可能小概率发生这个读的和写的不一样的过程。

但是如果读的和写的过程不一样的话,那么就是重新读一遍

也就是乐观锁需要 有情况去让你读和写的不一致的时候去检测出来并且重新读数据

 

 

这里说的是:对于这些集合,如果说想变成多线程安全的,那么就是对应拿新的接口去就行了。

 

 

在这个包里面的java.util.Concurrent里面去拿相应的东西。

 

 

 

刚刚说的是在这个集合里面去弄的话,集合里面的安全问题,是需要看的。

然后的话这个集合里面需要去看这个增量以及安全的问题。

所以的话 在这个atomic里面的这个有操作,就是看你是否正确的增强的问题

 

 

 

 

 

这个说的是线程池的优点,就是说不用频繁地创建线程来消耗资源。

然后的话就是说如果说空闲,就分配线程去做相应的资源

如果说忙碌的话,那么就是先放在队列里面去。

 

posted @ 2020-03-21 18:28  Start_from_Zero  阅读(134)  评论(0)    收藏  举报