线程中wait和sleep的区别
wait():wait()方法是Object类里的方法,用于线程通信,挂起,放cpu,放锁
1进入等待池
2释放对象锁,超时后返回
3其它线程可以访问
wait相当于多车道中靠边停车,释放锁和cpu
sleep():是Thread类的方法,用于线程的运行状态控制,睡眠,必须捕获异常,放cpu,不放锁
1阻塞当前线程,出让cpu
2锁没有释放,其它线程无法访问这个对象
3休眠时间满了以后不一定执行,因为其它线程可能正在运行,出发sleep的线程有更高优先级
sleep相当于多车道中,车停在车道上(睡着了),该车道无法使用,然后多出一条车道可以给别的车使用
【注意】notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁
【总结】notify是告诉wait()的线程什么时候可以去继续去申请锁了
sleep(100L)是占用cpu,线程休眠100毫秒,其他进程不能再占用cpu资源,wait(100L)是进入等待池中等待,交出cpu 等系统资源供其他进程使用,在这100毫秒中,该线程可以被其他线程notify,但不同的是其他在等待池中的线程不被notify不会出来,但这个线程 在等待100毫秒后会自动进入就绪队列等待系统分配资源,换句话说,sleep(100)在100毫秒后肯定会运行,但wait在100毫秒后还有等待 os调用分配资源,所以wait100的停止运行时间是不确定的,但至少是100毫秒。
多线程:
1同步包括互斥,互斥其实是一种特殊的同步
2ThreadLocal 线程局部变量的作用和目的:用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数
3多线程共享数据
多个线程行为一致,共同操作一个数据源。也就是每个线程执行的代码相同,可以使用同一个 Runnable 对
象,这个 Runnable 对象中有那个共享数据
多个线程行为不一致,共同操作一个数据源。也就是每个线程执行的代码不同,这时候需要用不同的
Runnable 对象。
4线程并发库 太多了
实现线程安全的两种方式?
synchronized与Lock。
二者的区别是什么?
synchronized不能中断等待;
Lock可以中断等待。
synchronized在JVM层面实现,出现异常时可以自动释放锁定;
Lock在代码层面实现,必须在finally{}中unLock。
资源竞争不激烈时,synchronized性能优;
资源竞争激烈时,Lock性能优。
Thread 类中的start() 和 run() 方法有什么区别?
当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程
run()是start()的回调函数
Java中Runnable和Callable有什么不同?
主要区别是Callable的 call() 方法可以返回值和抛出异常,而Runnable的run()方法没有这些功能。Callable可以返回装载有计算结果的Future对象
用Runnable还是Thread?
Java不支持类的多重继承,但允许你调用多个接口。所以如果你要继承其他类,当然是调用Runnable接口好了
Java中的volatile 变量是什么?
volatile是一个特殊的修饰符,只有成员变量才能使用它。在Java并发程序缺少同步类的情况下,多线程对成员变量的操作对其它线程是透明的。volatile变量可以保证下一个读取操作会在前一个写操作之后发生,就是上一题的volatile变量规则
为什么wait, notify 和 notifyAll这些方法不在thread类里面?
由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象
Java中堆和栈有什么不同?
为什么把这个问题归类在多线程和并发面试题里?因为栈是一块和线程紧密相关的内存区域。每个线程都有自己的栈内存,用于存储本地变量,方法参数和栈调用,一个线程中存储的变量对其它线程是不可见的。而堆是所有线程共享的一片公用内存区域。对象都在堆里创建,为了提升效率线程会从堆中弄一个缓存到自己的栈,如果多个线程使用该变量就可能引发问题,这时volatile 变量就可以发挥作用了,它要求线程从主存中读取变量的值。
如何避免死锁?
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。这是一个严重的问题,因为死锁会让你的程序挂起无法完成任务,死锁的发生必须满足以下四个条件:
互斥条件:一个资源每次只能被一个进程使用。
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。
Java线程池中submit() 和 execute()方法有什么区别?
两个方法都可以向线程池提交任务,execute()方法的返回类型是void,它定义在Executor接口中, 而submit()方法可以返回持有计算结果的Future对象,它定义在ExecutorService接口中,它扩展了Executor接口
Java多线程中调用wait() 和 sleep()方法有什么不同?
Java程序中wait 和 sleep都会造成某种形式的暂停,它们可以满足不同的需要。wait()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,而sleep()方法仅仅释放CPU资源或者让当前线程停止执行一段时间,但不会释放锁。

浙公网安备 33010602011771号