offer来了这本书怎么样?
这本书基本整体读过,几乎每一章都有做阅读笔记,但这本书实在不适合做面经,也不适合小白读,这部分在java锁机制的部分尤为明显,在选章部分没有逻辑顺序,每一部分我都读的相当痛苦,不得不结合csdn的帖子来进行理解,而且很多内容出现重复和矛盾,讲解的先后顺序作者并没有搞清,因此让我走了许多弯路。建议准备面试的同学还是慎重选择,这不是一本好书,只能说基本没有错误。
什么是条件锁,读写锁,自旋锁,可重入锁?
自旋锁:当进程进入CPU运行时,就会给它的代码上锁,以免别的CPU中的进程修改里面的代码(不排除CPU给别的CPU上锁这样的情况,以后会讨论到。)。所谓子旋锁就是这样的一把锁:进程A进入CPU,锁上门运行,进程B来到CPU前,发现门被锁上了,于是等待进程A出来交出开锁钥匙。
有什么办法能针对Java加密?
针对Java,现提供2种加密解决办法:
1、HASP加密锁提供的外壳加密工具中,有一个叫做DataHASP数据加密的功能,这个功能可以很好的防止反编译而去掉api的调用,大家知道:硬件加密锁的保护原理就是让加密过的软件和硬件紧密相连,调用不会轻易地被剔除,这样才能持久地保护您的软件不被盗版,同时,这种方式使用起来非常简单,很容易被程序员掌握,要对一个软件实现保护,大约只需几分钟就可以了。下面简要介绍一下它的原理:运用HASP HL的外壳工具先把当作一个数据文件来进行加密处理,生成新的java程序,因为这个加密过程是在锁内完成的,并采用了128位的AES算法,这样,加密后的java程序,无论你采用什么样的反编译工具,都是无法反编译出来。您的软件也只有被加密过的java解释器并有加密锁的情况下才能正常运行,如果没有加密锁,程序不能运行,从而达到真正保护您的软件的目的,该方法只支持Windows平台。
2、HASP提供专门针对java外壳加密工具,直接加密jar或war包,防止反编译,目前支持J2SE,J2EE主要支持容器为TOMCAT6.0以上,可在Windows和Linux平台下运行,如果情况适合则是最简单的使用方法。
多线程编程中锁如何保证自己是线程安全的?
要理解多线程种的锁机制我们得先了解线程的五大状态:
创建状态:当线程类编写完毕,我们创建这个线程类的对象的时候,当前创建的线程就处于创建状态。
就绪状态:当线程创建完毕,调用start()方法,该线程进入就绪状态,等等cpu分配资源运行的时间片。
运行状态:当cpu分配给该线程时间片的时候,线程就可以运行现在的内容, 那么线程记进入运行状态。
阻塞状态:当线程在运行的时候,可能被休眠或者其他方式让该线程让出cpu的使用资源,那么当前线程就进入阻塞状态。当阻塞时间完毕,线程再次进入就绪状态,等待cpu分配资源。
死亡状态:当线程该执行的所有内容执行完毕之后,线程就虎进入死亡状态。
多线程编程为什么要加锁
了解了线程的五大状态,那么线程为什么要加锁其实一个抢票的例子就能理解了:
抢票相信大家都能懂,是很多个人抢一张票,那么这里的每个人都是一个线程,也就是说多个线程要抢一个资源。如果不加锁的话,举个例子:网络游戏相信大家都玩过,对于程序来说,每个一个游戏角色都是一个线程。那么当世界boss出来的时候,是所有人都在打这么一个BOOS,但是游戏的机制就是这一个boss爆出来的装备只能被一个人拾取。如果有人已经在查看这个boss爆出来的箱子的时候,其它人是不能查看这个箱子的。但是如果这个boss爆出来的箱子没有加锁的话,那么所有游戏角色都可以同一时间打开这个箱子,那么也就是说所有人都可以拾取一遍里面的装备。这个时候锁的重要性就体现出来了。
什么是多线程的锁机制
说白了就是给多个线程共享的要做的事情加一把锁。每次进入这个事情操作的线程只能有一个,那么这样就会避免多个线程抢一个资源造成数据的不完整性。还是上面的比喻:加了锁之后会避免很多人同一时间来访问这个宝箱,并且当第一个查看的人拿了里面的其中一个装备,那么下一个人再次去查看的时候是没有了拿走的这件装备。那么也就是说查看并拾取装备这件事被加了锁。一次只能有一个线程进入并操作,这个线程从加锁的操作里面退出了其它线程才能进入。下面有个图就可以很好的解释这个问题:
三个颜色的球对应三个线程,中间的管道是所有线程都可以做的事情,那么对中间管道加锁之后,每次只能有一个球可以进去,并且这个求出来之后其它线程才能进入通过。
用专业点的术语来解释下:当我们给某个方法加锁之后,每次只能有一个线程进入该方法,进入该方法的线程会得到一个锁对象,如果这个线程不从加锁的方法中出来,就不会释放这个锁资源,那么其它线程得不到这个锁资源是不能进入该方法的。只有当进入的线程运行完毕释放这个锁资源,其它线程才有可能得到锁资源进入该方法
如何使用多线程的锁机制
好,我们理解了Java种线程的锁机制,在来看看如何使用线程中的锁机制:
使用锁机制其实就是用到一个关键字synchronized
synchronized修饰方法:同步方法
访问修饰符 synchronized 返回类型 方法名(参数列表){……}
或者
synchronized 访问修饰符 返回类型 方法名(参数列表){……}
synchronized修饰代码块:同步代码块
public void run() {
while (true) {
synchronized (this) { //同步代码块
// 省略修改数据的代码......
// 省略显示信息的代码......
}
}
}
同步代码块一般情况下使用所有线程共同使用的对象,this是最好的。
线程的概念比较简单,如果想深入了解的可以看看这个图
总结:加锁,会使线程进入的时候得到一个锁资源,那么这个锁资源就是同步中最重要的实现线程安全的概念。
以上是答主自己整理的理解内容,如果有更好看法的小伙伴可以在下方评论区留言,或者点个赞,加个关注我们一起探讨探讨。
还没有评论,来说两句吧...