Java多线程话题
一、线程如何实现
1、继承Thread类,重写run()方法。创建其子类对象(即线程对象),调用线程对象的start()方法来启动该线程
2、实现Runnable接口,并重写该接口的run()方法。创建该Runnable实现类的实例,并将此实例作为Thread的target(即构造函数中的参数)来创建Thread对象
3、创建Callable接口的实现类,并实现call()方法,该方法相比Runnable接口有返回值
二、多线程如何实现
1、用实现单个线程的方法去创建多个线程
2、线程池
三、线程安全问题是什么
在操作系统中,线程是不拥有资源的,进程是拥有资源的。而线程是由进程创建的,一个进程可以创建多个线程,这些线程共享着进程中的资源。
所以,当线程一起并发运行时,同时对一个数据进行修改,就可能会造成数据的不一致性。
四、线程安全问题有哪些解决办法
1、加锁:
(1)锁能使其保护的代码以串行的形式来访问,当给一个复合操作加锁后,能使其成为原子操作;
(2)加锁时需要考虑性能问题,不能总是一味地给整个方法加锁synchronized就了事了,应该将方法中不影响共享状态且执行时间比较长的代码分离出去;
(3)锁的含义不仅仅局限于互斥,还包括可见性。为了确保所有线程都能看见最新值,读操作和写操作必须使用同样的锁对象;
2、不共享状态:
(1)无状态对象: 无状态对象一定是线程安全的,因为不会影响到其他线程;
(2)线程关闭: 仅在单线程环境下使用;
3、不可变对象
可以使用final修饰的对象保证线程安全