一:java间线程通信目前包含主要是三个不同方式
1.关键字volatile ,这个关键字主要是让两个或多个线程间,对变量资源,也就是我认识的临界资源,通俗点就是volatile修饰的成员变量,形成内存可见性和操作的有序性。
理解解读起来: 每个线程对内存中的变量资源在本地复制一份副本,当线程A操作变量资源,是操作的本地副本,操作完后会立即把本地这个临界资源更新到内存中,然后线程B在操作变量资源的时候会先去主内存中更新最新的变量到自己的副本中,多线程中采用volatile大概是这个逻辑。
注:内存的可见性怎么保持,是A下次更新副本内存后会立即把副本更新到主内存,同时会把其他线程缓存的这个变量副本设置成过期,其他线程操作的时候会先去主内存拉新的内存到副本再操作。这个过程不是阻塞的,底层设计到cpu的操作。
2.多线程的生产和消费模型,进行线程之间的通信,这中间设计到一个公共变量对象,主要是对这个对象的加锁操作,然后通过wait(),notify(),等等,去进行多线程操作。
理解解读:如A,B,C,多线程,操作同一个变量对象,是根据这个对象的一些线程方法去操作不同线程的状态,如A先执行变量对象,操作完之后调变量对象的natifyAll()方法,是通知了其他的线程,可以执行,但是是A线程执行完后其他线程才会真唤醒执行。如果B线程拿到资源发现不符合条件,可以调变量对象的wait()方法,那么操作这个变量对象的线程B就会处于等待状态,不阻塞放弃锁,等其他现在再唤醒,以此循环, 或者是用join方式 ,开一个主线程,然后分多个子线程,执行子线程的时候把主线程阻塞,等子线程都执行完了,主线程拿到所有子线程的执行结果在执行操作。
注: wait(),notify(),notifyAll(),是属于Object 的也就是每个线程都有,但是sleep(),这种是属于线程Thread的. 。上锁一般是上的synchronized,ReadWriteLock,同步锁或者读写锁,如果实现一些原子记数操作用Atomic 相关的 一些变量类型修饰记数。
3.还有就是用管道Piped相关的输入输出流,对字节字符,绑定线程就行操作,这个没用过后续再看看。
积累总结。