1.syn和lock的区别?
1.syn可以写在代码块和方法上和类,而lock只能写在代码块上
2.syn不需要手动释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;lock必须使用unlock方法去释放锁,如果没有释放还会造成死锁
3.通过lock可以找到有没有成功获取到锁,而syn却无法办到
2.什么是死锁?如何避免死锁?
当线程A独占线程a,并尝试独占线程b,线程B独占线程b,并尝试独占线程a,双方都互相持有对方需要的锁,就会造成死锁。
1.尽量减少同步代码块
2.降低使用粒度,不要几个功能使用同一把锁
3.尽量使用 Java.util.concurrent并发类代替自己手动写锁
4.尽量使用trylock的方法,设置超时时间,超出时间时可以退出防止死锁。
3.线程的状态?
-
新建(New):当线程对象被创建但尚未启动时处于新建状态。
-
可运行(Runnable):线程对象调用了
start()
方法后,线程处于可运行状态。在可运行状态下,线程可能正在执行,也可能正在等待系统资源(如处理器时间片)。 -
运行(Running):线程获得了处理器时间片并正在执行其任务。
-
阻塞(Blocked):线程被阻塞并暂时停止执行,通常是因为等待某个操作的完成(如等待I/O操作、等待获取锁、等待某个条件满足等)。
-
等待(Waiting):线程等待某个特定条件的发生,需要其他线程显式地唤醒(如通过
wait()
方法)。 -
超时等待(Timed Waiting):线程等待一段特定的时间,超过时间后会自动唤醒。
-
终止(Terminated):线程执行完毕或出现异常导致终止,不再可运行。
4.notify和notifyAll的区别。
notifyAll()会唤醒所有线程,而notify只会唤醒一个线程。当notifyAll调用后,会将全部线程由等待池移动到锁池,参与锁的竞争,竞争成功则继续执行,如果不成功则继续留在锁池等待锁被释放后再次参与竞争。而notify()只会唤醒一个线程,具体唤醒哪一个由虚拟机决定。
5.wait和sleep方法区别。
1.wait来自Object类,而sleep来自Thread类
2.wait必须放在同步代码块,sleep可以在任何位置执行
3.wait会释放资源。sleep不会释放资源。
4.wait需要手动唤醒。sleep时间到了会自动唤醒。
6.Thread类中常见的方法
1.start 开启线程
2.yield 暂停当前线程,并执行其他线程。
3.sleep 使当前线程变成阻塞状态
4. jion 保证使用join的线程比其他线程先运行
5.stop 强制结束线程