今天小卓为大家整理一些Java编程技巧,以后每天都会陆续更新,感觉有用的朋友,可以收藏一下:
1.避免死锁
死锁出现的原因有很多。避免死锁不是一句话就能解决的。通常来说,当某个同步对象在等待另一个同步对象所拥有的资源上的锁时,便会产生死锁。
试着运行下下面的程序。它会告诉你什么是死锁。这个死锁是由于两个线程都在等待对方所拥有的资源,因此会产生死锁。它们会一直等待,没有谁会先放手。
运行结果:
AdditionThread:13
SubtractionThread:7
HoldingFirstLock...
HoldingSecondLock...
AdditionThread:WaitingforAddLock...
SubtractionThread:WaitingforSubLock...
但如果调用的顺序变一下的话,死锁的问题就解决了。
将MySubtractionThread中的线程加锁顺序调换再看看
运行结果:
AdditionThread:13
HoldingFirstLock...
AdditionThread:WaitingforAddLock...
Threads:HoldingAddandSubLocks...
SubtractionThread:7
HoldingSecondLock...
SubtractionThread:WaitingforSubLock...
Threads:HoldingAddandSubLocks...
三种用于避免死锁的技术:
1加锁顺序
2加锁时限
3死锁检测
一个更好的方案是给这些线程设置优先级,让一个(或几个)线程回退,剩下的线程就像没发生死锁一样继续保持着它们需要的锁。如果赋予这些线程的优先级是固定不变的,同一批线程总是会拥有更高的优先级。为避免这个问题,可以在死锁发生的时候设置随机的优先级。
2.JAVA运行内存的设置
一些java应用程序可以被高度的CPU密集型以及他们需要很多内存。这样的应用程序通常运行速度慢,因为内存高的要求。所以,我们可以在相关的配置文件中进行修改调整内存大小。
Xms=设置内存初始化的大小
Xmx=设置最大能够使用内存的大小
XX:PermSize=初始大小,将分配给JVM的启动过程
XX:MaxPermSize=最大尺寸可以分配JVM的启动过程
3.如何在java时间操作
有java时间两种标准方法:
System.currentTimeMillis()、System.nanoTime()
平时产生随机数时我们经常拿时间做种子,比如用System.currentTimeMillis的结果,但是在执行一些循环中使用了System.currentTimeMillis,那么每次的结果将会差别很小,甚至一样,因为现代的计算机运行速度很快。后来看到java中产生随机数函数以及线程池中的一些函数使用的都是System.nanoTime。
System.currentTimeMillis返回的是从.1.1UTC零点开始到现在的时间,精确到毫秒,平时我们可以根据System.currentTimeMillis来计算当前日期,星期几等,可以方便的与Date进行转换,
System.nanoTime提供相对精确的计时,但是不能用他来计算当前日期,
所以在使用中,我们可以根据我们具体的目的去正确的选择他们。
4.Float和Double的选择
DatatypeBytesusedSignificantfigures(decimal)Float47Doubledouble应该比float更好用,原因:
大多数处理器需要几乎相同数量的处理时间来执行浮点和双运算的操作。在相同数量的计算时间双提供了更高的精度。
想要了解更多的相关的Java开发等知识,请北京哪家皮肤病医院好重庆白癜风专科医院