java多线程自问自答

问题1:
每一个方法都是一个线程,那为什么还需要使用线程类启动线程呢?


回答:
因为不使用线程类启动的线程,例如主方法中引入多个方法,程序都是按照顺序执行的,任意一个方法未执行结束,都无法向下继续执行;
而使用线程类启动的线程,例如在主方法中启动了一个线程,此时,该线程与主方法共同争抢CPU资源,谁抢到谁执行,属于并发
并发使用的意义:多个线程对共享资源的使用和控制


问题2:
实现多线程遇到的主要问题是什么?
回答:
主要遇到的问题有2个:数据的原子性和共享数据的可见性
(1)、数据的原子性:
通过线程的互斥和同步实现,互斥通过synchronized关键字实现,保证只有一个线程对当前数据的使用;同步通过调用wait和notify、notifyAll方法实现,保证多线程之间进行切换时数据的一致;通常,互斥与同步结合使用。


(2)、共享数据的可见性:这里存在这样一个问题,那就是为什么普通方法没有提及数据可见性问题,而线程方法会存在这样的问题呢,如下:


现状:
1、所有共享变量都存放在主内存中,每一个线程都有自己的工作内存,工作内存存放共享变量的副本


2、Java线程对内存数据访问的规定:
线程对共享变量的所有操作都必须在自己的工作内存中进行,不能直接从主内存中读写数据
不同线程之间无法直接访问其他线程工作内存中的变量,线程间的变量值的传递需要通过主内存来完成


共享变量值可见,在单线程中,不存在共享变量被多个线程使用的问题,所以也不存在共享的问题,一块内存一个变量
而在多线程中,共同引用一个共享变量,要实现内存数据可见,原理如下:
如线程1对共享变量的修改要想被线程2及时看到,必须经过一下两个过程:
(1)、把工作内存1中更新的共享变量值刷新到主内存中
(2)、将主内存中最新的共享变量值更新到工作内存2中


synchronized关键字:具有原子性实现同步锁功能,同时具有实现共享变量可见性的功能
volatile关键字:只具有实现共享变量可见性的功能,不具有原子性,不能够实现线程同步操作。
要在多线程中安全的使用volatile变量,必须同时满足:
(1)、对变量的写入操作不依赖其当前值
不满足:number++,count = count*5等
满足:Boolean变量
(2)、该变量没有包含在具有其他变量的不变式中
不满足:不变式 low<up


PS:即使没有保证可见性的措施,很多时候共享变量依然能够在主内存和工作内存见得到即使的更新,原因在于:一般只有在短时间内高并发的情况下才会出现变量得不到及时更新的情况,因为CPU在执行时会很快地刷新缓存,所以一般情况下很难看到这种问题。


问题3:
线程同步(更确切的说应该叫线程互斥)的主要方法都有哪些:


回答:
同步方法、同步语句块、Lock(比较常用的是ReentrantLock可重入锁),都需要同步监视器,同步语句块需要显示的指定同步监视器,同步方法默认当前对象或类作为同步监视器,无需显示指定。
线程安全会降低执行效率,所以只需要对会改变竞争资源的方法或语句块执行同步操作,
同步方法或同步语句块执行完毕则释放同步锁,
如果需要执行过程中间歇释放、唤醒同步锁,则可以使用wait()、notify()、notifyAll()方法实现


同步监视器分为:对象和类,静态同步同步监视器为类,非静态同步同步监视器为对象,相关使用方式如下:
同步静态方法:public static synchronized methodName(){}
同步非静态方法:public synchronized methodName(){}


同步静态语句块:synchronized(Object.class){}
同步非静态语句块:synchronized(obj/this){}


可重人锁的使用:
1、声明锁对象:private final ReentrantLock lock = new ReentrantLock();
2、在需要加锁的位置显示加锁:lock.lock();

2、定义try{}finally{}语句块,加锁的实现逻辑放在try语句块中,释放锁放在finally语句块中,如:finally{lock.unlock();}


比较不错的多线程文章分享:

Java多线程编程
java 多线程
java synchronized
Java多线程编程总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值