本书主要是如下六章内容:
第一章: Java多线程技能
第二章:对象及变量的并发访问
第三章:线程间通信
第四章:Lock的使用
第五章:定时器Timer
第六章:单例模式与多线程
1、多线程是异步的
2、实现多线程方式:继承Thread类;实现Runnable接口
3、线程间的数据共享问题:
线程间的数据不共享实例:
public class MyThread extends Thread{
private int count=5;
public MyThread(String name){
super();
this.setName(name);
}
@Override
public void run(){
super.run();
while(count>0){
count--;
System.out.println(count+":"+Thread.currentThread().getName());
}
}
}
public class Run {
public static void main(String[] args) {
MyThread myThread1=new MyThread("a");
MyThread myThread2=new MyThread("b");
MyThread myThread3=new MyThread("c");
myThread1.start();
myThread2.start();
myThread3.start();
}
}
线程间数据共享实例:
public class MyThread extends Thread{
private int count=5;
@Override
public void run(){
super.run();
while(count>0){
count--;
System.out.println(count+":"+Thread.currentThread().getName());
}
}
}
public class Run {
public static void main(String[] args) {
MyThread myThread1=new MyThread();
Thread thread1=new Thread(myThread1,"a");
Thread thread2=new Thread(myThread1,"b");
Thread thread3=new Thread(myThread1,"c");
thread1.start();
thread2.start();
thread3.start();
}
}
上述线程间的数据共享实例会产生非线程安全问题,可以在方法或对象上加synchronized关键字解决
将MyThread类改为:
public class MyThread extends Thread{
private int count=5;
@Override
synchronized public void run(){
super.run();
while(count>0){
count--;
System.out.println(count+":"+Thread.currentThread().getName());
}
}
}
4、非线程安全会造成数据脏读,即读到的数据是修改过的。脏读一定会出现操作实例变量的情况,这就是不同线程争抢实例变量的结果。
5、方法中的变量不存在非线性安全问题
6、线程间的通信:
①用waite、notify实现线程间的通信,比较典型的是消费者、生产者问题
②通过管道进行线程间的通信:字节流、字符流。在Java的JDK中提供了4个类来进行线程间的通信:PipeInputStream、PipeOutputStream、PipedReader、PipedWriter
7、join与synchronized的区别:join在内部使用wait()方法进行等待,而synchronized关键字使用的是“对象监视器”原理作为同步
8、线程变量具有隔离性
9、使用InheritanleThreadLocal类可以让子线程从父线程中取得值
10、Lock实现线程间的同步,使用Condition实现线程间的等待、通知。Condition可以实现多路通知功能。
这本书花了一个星期的时间大概看了一下,比较适合我这种初级水平,写的简单易懂,但是内容非常丰富。