网站关键词被百度屏蔽怎么办,wordpress customizr,my8777网域名查询,ps教学网站制作步骤目录
39、volatile 有什么用#xff1f;能否用一句话说明下 volatile 的应用场景#xff1f;
40、为什么代码会重排序#xff1f;
41、在 java 中 wait 和 sleep 方法的不同#xff1f;
42、用 Java 实现阻塞队列
43、一个线程运行时发生异常会怎样#xff1f;
44、…目录
39、volatile 有什么用能否用一句话说明下 volatile 的应用场景
40、为什么代码会重排序
41、在 java 中 wait 和 sleep 方法的不同
42、用 Java 实现阻塞队列
43、一个线程运行时发生异常会怎样
44、如何在两个线程间共享数据
45、Java 中 notify 和 notifyAll 有什么区别
46、为什么 wait, notify 和 notifyAll 这些方法不在 thread类里面
47、什么是 ThreadLocal 变量
48、Java 中 interrupted 和 isInterrupted 方法的区别
49、为什么 wait 和 notify 方法要在同步块中调用
50、为什么你应该在循环中检查等待条件?
51、Java 中的同步集合与并发集合有什么区别 39、volatile 有什么用能否用一句话说明下 volatile 的应用场景
volatile 保证内存可见性和禁止指令重排。
volatile 用于多线程环境下的单次操作(单次读或者单次写)。 40、为什么代码会重排序
在执行程序时为了提供性能处理器和编译器常常会对指令进行重排序但是不能随意重排序不是你想怎么排序就怎么排序它需要满足以下两个条件
在单线程环境下不能改变程序运行的结果
存在数据依赖关系的不允许重排序
需要注意的是重排序不会影响单线程环境的执行结果但是会破坏多线程的执行语义。 41、在 java 中 wait 和 sleep 方法的不同
最大的不同是在等待时 wait 会释放锁而 sleep 一直持有锁。Wait 通常被用于线程间交互sleep 通常被用于暂停执行。
直接了解的深入一点吧
在 Java 中线程的状态一共被分成 6 种
初始态NEW
创建一个 Thread 对象但还未调用 start()启动线程时线程处于初始态。
运行态RUNNABLE
在 Java 中运行态包括就绪态 和 运行态。
就绪态 该状态下的线程已经获得执行所需的所有资源只要 CPU 分配执行权就能运行。所有就绪态的线程存放在就绪队列中。
运行态 获得 CPU 执行权正在执行的线程。由于一个 CPU 同一时刻只能执行一条线程因此每个 CPU 每个时刻只有一条运行态的线程。
阻塞态
当一条正在执行的线程请求某一资源失败时就会进入阻塞态。而在 Java 中阻塞态专指请求锁失败时进入的状态。由一个阻塞队列存放所有阻塞态的线程。处于阻塞态的线程会不断请求资源一旦请求成功就会进入就绪队列等待执行。
PS锁、IO、Socket 等都资源。
等待态
当前线程中调用 wait、join、park 函数时当前线程就会进入等待态。也有一个等待队列存放所有等待态的线程。线程处于等待态表示它需要等待其他线程的指示才能继续运行。进入等待态的线程会释放 CPU 执行权并释放资源如锁
超时等待态
当运行中的线程调用 sleep(time)、wait、join、parkNanos、parkUntil 时就会进入该状态它和等待态一样并不是因为请求不到资源而是主动进入并且进入后需要其他线程唤醒进入该状态后释放 CPU 执行权 和 占有的资源。与等待态的区别到了超时时间后自动进入阻塞队列开始竞争锁。
终止态
线程执行结束后的状态。
注意
wait()方法会释放 CPU 执行权 和 占有的锁。
sleep(long)方法仅释放 CPU 使用权锁仍然占用线程被放入超时等待队列与
yield 相比它会使线程较长时间得不到运行。
yield()方法仅释放 CPU 执行权锁仍然占用线程会被放入就绪队列会在短时间内再次执行。
wait 和 notify 必须配套使用即必须使用同一把锁调用
wait 和 notify 必须放在一个同步块中调用 wait 和 notify 的对象必须是他们所处同步块的锁对象。 42、用 Java 实现阻塞队列
参考 java 中的阻塞队列的内容吧直接实现有点烦
http://www.infoq.com/cn/articles/java-blocking-queue 43、一个线程运行时发生异常会怎样
如果异常没有被捕获该线程将会停止执行。Thread.UncaughtExceptionHandler是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。当一个未捕获异常将造成线程中断的时候 JVM 会使用 Thread.getUncaughtExceptionHandler()来查询线程的 UncaughtExceptionHandler 并将线程和异常作为参数传递给handler 的 uncaughtException()方法进行处理。 44、如何在两个线程间共享数据
在两个线程间共享变量即可实现共享。
一般来说共享变量要求变量本身是线程安全的然后在线程内使用的时候如果有对共享变量的复合操作那么也得保证复合操作的线程安全性。 45、Java 中 notify 和 notifyAll 有什么区别
notify() 方法不能唤醒某个具体的线程所以只有一个线程在等待的时候它才有用武之地。而 notifyAll()唤醒所有线程并允许他们争夺锁确保了至少有一个线程能继续运行。 46、为什么 wait, notify 和 notifyAll 这些方法不在 thread类里面
一个很明显的原因是 JAVA 提供的锁是对象级的而不是线程级的每个对象都有锁通过线程获得。由于 waitnotify 和 notifyAll 都是锁级别的操作所以把他们定义在 Object 类中因为锁属于对象。 47、什么是 ThreadLocal 变量
ThreadLocal 是 Java 里一种特殊的变量。每个线程都有一个 ThreadLocal 就是每个线程都拥有了自己独立的一个变量竞争条件被彻底消除了。它是为创建代价高昂的对象获取线程安全的好方法比如你可以用 ThreadLocal 让SimpleDateFormat 变成线程安全的因为那个类创建代价高昂且每次调用都需要创建不同的实例所以不值得在局部范围使用它如果为每个线程提供一个自己独有的变量拷贝将大大提高效率。首先通过复用减少了代价高昂的对象的创建个数。其次你在没有使用高代价的同步或者不变性的情况下获得了线程安全。 48、Java 中 interrupted 和 isInterrupted 方法的区别
interrupt
interrupt 方法用于中断线程。调用该方法的线程的状态为将被置为”中断”状态。
注意线程中断仅仅是置线程的中断状态位不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法也就是线程中断后会抛出interruptedException 的方法就是在监视线程的中断状态一旦线程的中断状态被置为“中断状态”就会抛出中断异常。
interrupted
查询当前线程的中断状态并且清除原状态。如果一个线程被中断了第一次调用 interrupted 则返回 true第二次和后面的就返回 false 了。
isInterrupted
仅仅是查询当前线程的中断状态 49、为什么 wait 和 notify 方法要在同步块中调用
Java API 强制要求这样做如果你不这么做你的代码会抛出IllegalMonitorStateException 异常。还有一个原因是为了避免 wait 和 notify之间产生竞态条件。 50、为什么你应该在循环中检查等待条件?
处于等待状态的线程可能会收到错误警报和伪唤醒如果不在循环中检查等待条件程序就会在没有满足结束条件的情况下退出。 51、Java 中的同步集合与并发集合有什么区别
同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合不过并发集合的可扩展性更高。在 Java1.5 之前程序员们只有同步集合来用且在多线程并发的时候会导致争用阻碍了系统的扩展性。Java5 介绍了并发集合像ConcurrentHashMap不仅提供线程安全还用锁分离和内部分区等现代技术提高了可扩展性。 要想了解更多
千题千解·Java面试宝典_时光の尘的博客-CSDN博客