多线程

Java.lang包,Thread类,Runnable接口。

创建线程的两种方式

方式一:继承Thread类

1.定义类继承Thread类;

2.子类覆盖父类中的run方法,将线程运行的代码存放在run中;

3.建立子类对象的同时线程也被创建;

4.通过调用start方法开启线程。

public class MyThread extends Thread{
    public void run(){
        //运行代码;
    }
}
public class ThreadDemo {
    MyThread mt = new MyThread();
    mt.start();
}

方式二:实现Runnable接口(建议使用该方式)

1.定义类实现Runnable接口;

2.覆盖Runnable接口中的run方法,将线程运行的代码存放在run中;

3.通过Thread类建立线程对象;

4.将runnable接口的子类对象作为实际参数传递给Thread类的构造函数;

5.调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

public class MyThread implements Runnable{
    public void run(){
        //运行代码;
    }
}
public class ThreadDemo {
    MyThread mt = new MyThread();
    Thread t = new Thread(mt);
    t.start();
}

多线程的运行存在安全问题,原因:

当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误。

解决办法:同步。

同步的前提:

1.必须要有两个或者两个以上的线程;

2.必须是多个线程使用同一个锁。

同步有两种方式

同步方式一:同步代码块

Synchronized(对象){
    //需要被同步的代码;
}

同步方式二:同步函数

Public synchronized void show(){
    //需要被同步的代码;
}
 
同步代码块使用的锁是对象:Object obj = new Object();synchronized(obj){}   ;
同步函数使用的锁是:this;
同步函数被静态static修饰后,使用的锁是:该方法所在类的字节码文件对象,类名.class,该对象的类型是Class。

设计模式:解决某一类问题最行之有效的方法,Java中共有23种设计模式。

设计模式之一:单例设计模式,解决一个类在内存中只存在一个对象。

有两种方式:饿汉式和懒汉式,建议使用饿汉式,懒汉式存在安全问题,需同步。

饿汉式,先初始化对象:

class Single{
    private Single(){} //1.将构造函数私有化,禁止其他程序建立该类对象;
    private static final Single s = new Single(); //在类中建立一个本类对象;
    public static Single getInstance(){ //提供一个方法,方便其他程序可以获取并访问该对象。
        return s;
    } 
    ......
}
class SingleDemo{
    public static void main(String[] args){
            Single ss = Single.getInstance();
    }
    ......
}

懒汉式,方法被调用时,对象才初始化:

class Single{
    private Single(){} //1.将构造函数私有化,禁止其他程序建立该类对象;
    private static Single s = null; //在类中建立一个本类对象;
    public static Single getInstance(){ //提供一个方法,方便其他程序可以获取并访问该对象。
        if(s == null){
            s = new Single(); 
        }
        return s;
    } 
    ......
}
class SingleDemo{
    public static void main(String[] args){
        Single ss = Single.getInstance();
    }
    ......
}

懒汉式的特点在于实例的延迟加载,通过多线程访问时会出现安全问题,可以加同步来解决,加同步的方式,用同步代码块和同步函数都行,但是稍微有些低效,用双重判断的形式能解决效率问题,加同步的时候使用的锁是:该类所属的字节码文件对象。如下:

class Single{
    private Single(){} 
    private static Single s = null; 
    public static Single getInstance(){ 
        if(s == null){
            Synchronized(Single.class) { //静态方法的锁:类名.class
                if(s == null){
                    s = new Single(); 
                }
            }
        }
        return s;
    } 
    ......
}
posted @ 2014-07-25 21:40  小样儿1020  阅读(167)  评论(0编辑  收藏  举报