多线程

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;

    } 

    ......

}

你可能感兴趣的:(多线程)