AtomicInteger 是线程安全的类,使用它可以将 ++ 操作和 -- 操作,变成一个原子性操作,这样就能解决非线程安全的问题了,如下代码所示: importjava.util.concurrent.atomic.AtomicInteger;publicclassAtomicIntegerExample{// 创建 AtomicIntegerprivatestaticAtomicIntegernumber=newAtomicInteger(0);// 循环次数privatestaticfinalin...
接下来我们使用 ReentrantLock 来演示一下公平锁和非公平锁的执行差异,首先定义一个公平锁,开启 3 个线程,每个线程执行两次加锁和释放锁并打印线程名的操作,如下代码所示: importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassReentrantLockFairTest{staticLocklock=newReentrantL...
inti=0;System.out.println(iinstanceofInteger);//编译不通过 i必须是引用类型,不能是基本类型System.out.println(iinstanceofObject);//编译不通过Integerinteger=newInteger(1);System.out.println(integerinstanceofInteger);//true//false ,在 JavaSE规范 中对 instanceof 运算符的规定就是:如果 obj 为 null...
我觉得文中说的“数组使用关键词 final 修饰,因此数组内容不可变”,这句话并不对,final修饰的char数组value的内容应该是能改的,只是value不能指向其他的数组对象而已,并且因为该数组为private,也没有对外提供修改的方法,所以字符串对象才无法修改。 7 回复2 ...
列举五种 Java 常见的异常类型 NullPointerException:空指针异常。 ArrayIndexOutOfBoundsException:数组下标越界异常。 ArithmeticException:算术运算异常。 NumberFormatException:数字格式异常。 IOException:输入输出异常。 本篇内容节选自《Java 面试突击》 3
面试突击40:线程休眠的方法有几种? 在Java 中,让线程休眠的方法有很多,这些方法大致可以分为两类,一类是设置时间,在一段时间后自动唤醒,而另一个类是提供了一对休眠和唤醒的方法,在线程休眠之后,可以在任意时间对线程进行唤醒。 PS:休眠是指让某个线程暂停执行(进入等待状态),唤醒指的是让某个暂停的线程继续...
其中使用 Executors 自动创建线程的方式,因为线程个数或者任务个数不可控,可能会导致内存溢出的风险,所以在创建线程池时,建议使用 ThreadPoolExecutor 的方式来创建。 是非审之于己,毁誉听之于人,得失安之于数。 公众号:Java面试真题解析 面试合集:https://gitee.com/mydb/interview...
面试突击34:如何使用线程池执行定时任务? 在Java 语言中,有两个线程池可以执行定时任务:ScheduledThreadPool 和 SingleThreadScheduledExecutor,其中 SingleThreadScheduledExecutor 可以看做是 ScheduledThreadPool 的单线程版本,它的用法和 ScheduledThreadPool 是一样的,所以本文重点来看 ScheduledThreadPool 线程池的使用。
面试突击31:什么是守护线程?它和用户线程有什么区别? 在Java 语言中,线程分为两类:用户线程和守护线程,默认情况下我们创建的线程或线程池都是用户线程,所以用户线程也被称之为普通线程。 想要查看线程到底是用户线程还是守护线程,可以通过 Thread.isDaemon() 方法来判断,如果返回的结果是 true 则为守护线程,反之则...
面试突击33:线程池有哪些状态?状态是如何转换的? 在Java 中,线程池的状态和线程的状态是完全不同的,线程有 6 种状态:NEW:初始化状态、RUNNABLE:可运行/运行状态、BLOCKED:阻塞状态、WAITING:无时限等待状态、TIMED_WAITING:有时限等待状态和 TERMINATED:终止状态。而线程池的状态有以下 5 种:...