0、(why)每一个线程都有本身的栈空间,咱们要线程之间进行交流,合做双赢。java
一、synchronized和volatile关键字缓存
a) 看下面的synchronized关键字安全
b) 看下面的volatile关键字多线程
二、等待/通知机制:一个线程A调用对象的wait()方法,另外一个线程调用线程B的notity()或者的notifyall()方法.并发
a) 顺序打印奇数偶数优化
public class ThreadPrintDemo2 { public static void main(String[] args) { final ThreadPrintDemo2 demo2 = new ThreadPrintDemo2(); //java8新特性 Thread t1 = new Thread(demo2 :: print1); Thread t2 = new Thread(demo2 :: print2); t1.start(); t2.start(); } public synchronized void print2() { for (int i = 1; i <= 100; i +=2) { System.out.println(i); this.notify(); //通知等待中的进程 try { this.wait(); //线程进入等待 Thread.sleep(100);// 防止打印速度过快致使混乱 } catch (InterruptedException e) { // NO } } } public synchronized void print1() { for (int i = 0; i <= 100; i += 2) { System.out.println(i); this.notify(); //通知等待中的进程 try { this.wait(); //线程进入等待 Thread.sleep(100);// 防止打印速度过快致使混乱 } catch (InterruptedException e) { // NO } } } }
b) 打印连续句子this
public class ThreadPrintDemo2 { private char[] arr = new char[]{'a', ' ', 'b', 'c', 'd', 'e'}; public static void main(String[] args) { final ThreadPrintDemo2 demo2 = new ThreadPrintDemo2(); Thread t1 = new Thread(demo2::print1); Thread t2 = new Thread(demo2::print2); t1.start(); t2.start(); } public synchronized void print2() { for (int i = 1; i < arr.length; i +=2) { System.out.print(arr[i]); this.notify(); try { this.wait(); Thread.sleep(100);// 防止打印速度过快致使混乱 } catch (InterruptedException e) { // NO } } } public synchronized void print1() { for (int i = 0; i < arr.length; i +=2) { System.out.print(arr[i]); this.notify(); try { this.wait(); Thread.sleep(100);// 防止打印速度过快致使混乱 } catch (InterruptedException e) { // NO } } } }
结果:a bcde
三、管道输入输出流:pipedreader和pipedwriter 面向字符spa
Pipedoutputstream和pipedinputstream面向字节线程
四、使用thread.join()方法:利用线程等待特性3d
五、使用ThreadLocal线程变量
一、基础:Java中每个对象均可以做为锁
二、手段:确保多线程在同一时刻,只有一个线程处于方法或同步块中
三、实现原理:JVM基于进入和退出monitor对象来实现方法同步和代码块同步
四、锁优化:jdk1.6以后优化了锁,加入了偏向锁和轻量级锁,锁能够升级但不能降级
五、使用场景:方法 代码块
一、他是一个接口
二、使用的时候须要显式获取锁
三、使用方法:
Lock lock = new ReentrantLock(); lock.lock(); try { }finally { lock.unlock(); }
四、Synchronized常常与Lock放在一块儿比较
一、是什么:(what)是轻且量级的synchronize,保证共享变量的可见性(一个线程修改一个共享变量的时候,另外一个线程会知道),并他不会引发线程的上下文切换和调度。
二、使用场景:修饰变量
三、优化:在1.7中将共享变量追加了60个字节,变成64个字节。由于(硬件)目前流行的cpu的高速缓存行是64个字节,当队列的头尾节点不足64字节时候,处理器会将他们读到同一个缓存行,而且锁定缓存行。这样会影响队列出队入队效率。
为每一个线程变量建立一个该变量的副本,避免并发访问的线程安全问题,保证线程安全
欢迎关注公众号 布尔bl ,分享Java相关信息技术、生活感悟。