扫码关注公众号
如何确保线程安全?
解决办法:使用多线程之间使用关键字synchronized、或者使用锁(lock),或者volatile关键字。①synchronized(自动锁,锁的创建和释放都是自动的);②lock手动锁(手动指定锁的创建和释放)。③volatile关键字为什么能解决?如果可能会发生数据冲突问题(线程不安全问题),只能让当前一个线程进行执行。代码执行完成后释放锁,然后才能让其他线程进行执行。这样的话就可以解决线程不安全问题。
线程的sleep()方法和yield()方法有什么区别?
①sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;②线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;③sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;④sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。
关于sleep()和wait(),以下描述错误的一项是()
正确答案是D分析:针对此对象的notify方法后获取对象锁并进入就绪状态,而不是运行状态。另外针对此对象的notifyAll方法后也可能获取对象锁并进入就绪状态,而不是运行状态。
以下锁机机制中,不能保证线程安全的是()
正确答案是C当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。
既然 start() 方法会调用 run() 方法,为什么我们调用 start() 方法,而不直接调用 run() 方法?
这是一个基本的Java多线程面试题。一般在Java中级面试的电话面试或一轮面试中遇到。这道问题的答案是这样的:当你调用start()方法时,它会新建一个线程然后执行run()方法中的代码。如果直接调用run()方法,并不会创建新线程,方法中的代码会在当前调用者的线程中执行。