java 数组转字符串????回答主要是三个方面:(1)ha(6)
Java内存模型的两条规定
(1)线程对共享变量的所有操作都必须在自己的工作内存中进行,不能直接从主内存中读写;
(2)不同线程无法直接访问其他线程工作内存中的变量,线程间变量值的访问都需要通过主内存来完成。
常常需要在隔两分钟后再收集一次thread dump,如果得到的输出相同,仍然是大量thread都在等待给同一个地址上的锁,那么肯定是死锁了。
3.1.2 各种锁
1、悲观锁
无论共享数据是否产生争用、是否由于争用产生冲突,都会加锁。
2、乐观锁
假设没有共享数据争用,就执行成功。若监测出有共享数据争用产生冲突,就进行补救措施(如:重试)。
3、可重入锁
一个线程加锁了,该线程中调用其他的方法,也同样加锁了,如递归;
4、读写锁
对一个资源的访问,可以分成读锁和写锁;
5、可中断锁
一个线程等待的时间太长,可以中断等待的过程,去执行其他的事情;
6、公平锁
尽量以锁的顺序来获取锁;
7、优化方面的锁
1)自旋锁(自适应锁)
共享数据锁定状态比较短,对于阻塞的线程不要立马挂起,而是自旋一下就可得到,避免线程切换的开销。
2)锁消除
有些数据是不会被其他线程访问到的,这时候就不需要加同步措施,进行锁消除。
3)锁粗化
同步块的作用域一般越小越好,但是对一个对象的连续操作,不停的加锁解锁,这样会出现很大的性能问题。
4)轻量级锁
为了减少获得锁和释放锁所带来的性能消耗。Java 1.6有无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态四个状态。随着竞争,不断升级,不能降级。java 数组转字符串
5)偏向锁
目的是消除数据在无竞争情况下的同步原语。进一步提升程序的运行性能。 偏向锁就是偏心的锁,意思是这个锁会偏向第一个获得他的线程。
Throwable是java语言中所有错误和异常的基类,它由两个子类:Error, Exception.
异常种类
Error: Error为错误,是程序无法处理的,如OutOfMemoryError,ThreadDeath等,出现这种情况你唯一能做的就是听之任之,交由JVM来处理,不过大多数情况下会选择终止线程。
Exception: Exception是程序可以处理的异常,它又分为两种CheckedException(受检异常),一种是unCheckedException(不受检异常)
CheckedException发生在编译阶段,必须要使用try……catch(或则throws)否则编译不通过
unCheckedException发生在运行期,具有不确定性,主要是由于程序的逻辑问题所引起的,难以排查,我们一般都需要纵观全局才能够发现这类的异常错误。
常见异常的基类:
IOException
RuntimeException
5、 加载问题
Static:
1)修饰变量:静态变量随着类加载时被完全初始化,内存中只有一个,且JVM也只会为它分配一次内存,所有类共享静态变量。
2)修饰方法:在类加载的时候就在,不依赖任何实例;static方法必须实现,不能用abstract修饰。
3)修饰代码块:在类加载完成后就会执行代码块中的内容
4)执行的顺序:父类静态代码块—>子类静态代码块—->父类非静态代码块—->父类构造方法—–>子类非静态代码块—–>子类构造方法
Final:
1)修饰变量:编译期常量(类加载的过程完成初始化,编译后带入到任何计算式中,只能是基本类型) 运行时常量(基本数据类型或引用数据类型,引用不可变,但引用的对象内容可变)
2)修饰方法:不能被继承,不能被子类修改
结果全军覆没