1.线程同步(互斥-独占)
a.为什么?
目的:为了解决数据的并发异常。
多个线程 操作同一个资源的时候,可能会引发数据不一致。
资源叫做 临界资源。
现象叫做 并发。
b.同步本质
每一个对象,有且只有一个对象(锁)监视器(同步锁)。
并且,对象监视器 只能被一个线程持有。
synchronized 研究的是 线程 与 对象监视器
之间的关系。
c.应用
打电话
单例
I.不允许外部 new 该对象
构造器 private
II.势必类 内部 提供一个方法 为
外部 得到 该 类的 实例 只能静态方法
III.确保 单例
懒:static 静态方法
饿:synchronized 块 代码 执行 性能很差
private static A a = new A();
2.同步 协助
生产者消费案例
public class Tel{
public String name;
public void call(){
for(int i=1;i<10;i++){
System.out.println(Thread.currentTread().getName()+"用电话"+name+"拨号"+i+"--");
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
public class Persnon extends Thread{
public Person(String name){
super(name);
}
public Tel tel;
public Tel getTel(){
return tel;
}
public void setTel(Tel tel){
this.tel=tel;
}
public void run(){
Synchronized(tel){ //同步块(同步锁)(项目中,同步锁的效率极低)
tel.call();
}
}
}
public class Test{
public static void main(String[])args{
Tel t1 = new Tel();
t1.name = "摩托罗拉";
Tel t2 = new Tel();
t2.name = "诺基亚";
Person p1 = new Person("张三线程");
p1.setTel(t1);
Person p2 = new Person("李四线程");
p2.setTel(t2);
p1.start();
p1.start();
}
}
/**
*单例
*/
public class A{
private static A a;
private A(){
System.ou.println("-----");
}
public static A getInstance(){
if(a==null){
a=new A();
}
return a;
}
}
/**
*测试
*/
public class Test(){
new Tread(){
public void run(){
A.getInstance();
}
}.start(); //匿名内部类
A.getInstance();
A.getInstance();
A.getInstance();
}