【黑马】程序员————多线程(二)单例设计模式、线程间通信,JDK1.5互斥锁

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!-----

一、单例设计模式

单例设计模式的意义:

A.保证类在内存中只有一个对象,不提供外部访问方式,构造函数用private修饰。

B.提供公共方法(static修饰,类的静态方法),获取类的实例。单例设计模式分为饿汉和懒汉两种模式。

饿汉式&懒汉式

class Test33 {

    public static void main(String[] args) {

        Fanjianan.getInstance();

    }

}

class Fanjianan {
    private Fanjianan() {

    }
    //创建静态私有对象
    private static Fanjianan fjn = new Fanjianan();

    //提供公共访问方法获取对象实例
    public static Fanjianan getInstance() {
        return fjn;
    }
    /*懒汉式,懒得new,要用的时候再new
    private static Fanjianan fjn;
    public static Fanjianan getInstance() {
        if(fjn == null)
            fjn = new Fanjianan();
        return fjn;
    }
    */
}

单例类举例:

Runtime类

Runtime r = Rutime.getRuntime();

r.exec("shutdown -s -t 300"); //300秒后关机

r.exec("shutdown -a");  //取消关机

Timer类,计时器

import java.util.*;

    public class Test33{
        /**
         * @param args
         * 计时器
         * @throws InterruptedException
         */
        public static void main(String[] args) throws InterruptedException {
            Timer t = new Timer();
            t.schedule(new MyTimerTask(), 0,3000);

            while(true) {
                System.out.println(new Date());
                Thread.sleep(1000);
            }
        }
    }
    class MyTimerTask extends TimerTask {
        @Override
        public void run() {
            System.out.println("起床背英语单词");
        }

    }

二、线程通信

线程间通信原理:

1、多个线程并发执行,默认情况下CPU随机切换线程。如果希望有规律的执行,可以使用通信手段。

2、wait()方法和notify()方法暂停、唤醒线程。两个方法必须在同步代码中执行,并且使用同步锁对象调用。

3.3个以上多线程通信,notify()随机唤醒线程,notifyAll()唤醒所有线程。while判断条件

/*生产者消费者
 * 示  例
 */

public class Test33 {
    public static void main(String[] args) {

        Goods goods = new Goods();
        Thread t1 = new Thread(new Producer(goods));
        Thread t2 = new Thread(new SalesMan(goods));
        Thread t3 = new Thread(new Producer(goods));

        t1.start();t2.start();t3.start();

    }
}

class Goods {  //货物类,id和型号

    private int id = 0;
    private String mode;
    private boolean flag = false;

    public synchronized void setGoods(String mode) {  //生产方法

        if(flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                                e.printStackTrace();
            }
        }

        this.mode = mode;

        System.out.println(Thread.currentThread().getName()+"....生产了。。。商品:"+ ++id+"。。。"+mode );
        flag = true;

        notifyAll();  //唤醒出售线程

    }

    public synchronized void saleGoods() {

        if(!flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                                e.printStackTrace();
            }
        }

        System.out.println(Thread.currentThread().getName()+"....售出了。。。商品:"+this.id+"。。。"+mode );
        flag = false;

        notifyAll();

    }

}

class Producer implements Runnable { //生产者线程

    private Goods goods;
    Producer(Goods goods) {
        this.goods = goods;
    }

    public void run() {

        for(int i = 0;i<200;i++) {
            goods.setGoods("本田SCR-V");
        }

    }
}

class SalesMan implements Runnable {

    private Goods goods;

    SalesMan(Goods goods) {
        this.goods = goods;
    }
    public void run() {

        while(true) {
            goods.saleGoods();
        }

    }
}

三、JDK1.5互斥锁

时间: 2024-12-26 12:08:06

【黑马】程序员————多线程(二)单例设计模式、线程间通信,JDK1.5互斥锁的相关文章

黑马程序员——Java基础---单例

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流!                                         单例 设计模式:解决问题最行之有效的方法,让问题简单化,Java中有23种. 单例:解决一个类在内存,只有一个对象 想要保证对象唯一: 1,为了避免其他程序过多建立该类对象,

黑马程序员------多线程(二)

1.1 同步代码块:Java对多线程的安全问题提供了专业的解决方式 格式: synchronized(对象){ 需要被同步的代码(共享数据) } 对象如同锁.持有锁的线程可以在同步中执行.没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁. 火车上的卫生间---经典. 同步的前提:1,必须要有两个或者两个以上的线程.2,必须是多个线程使用同一个锁. 必须保证同步中只能有一个线程在运行. 好处:解决了多线程的安全问题. 弊端:多个线程需要判断锁,较为消耗资源 示例1: 1 class

JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是class对象 我们在上节验证了同步函数的锁是this,但是对于静态同步函数,你又知道多少呢? 我们做一个这样的小实验,我们给show方法加上static关键字去修饰 private static synchronized void show() { if (tick > 0) { try { Thread

黑马程序员—多线程

进程:一个正在执行的程序. 线程:就是进程中一个独立的控制单元,线程在控制进程的执行,一个进程中至少有 一个线程. 主线程:JVM启动的时候会有一个进程java.exe,该进程中至少有一个负责java程序的执行 而且这个线程运行的代码存在于main方法中,该线程称之位主线程. 创建线程的方式有两种: 方法一: 1.定义类继承Thread2.复写Thread类中的run方法 目的:将自定义代码存储在run方法中,让线程运行3.调用线程的start方法 该方法有两个作用:启动线程,调用run方法(存

多线程练习 -- 单例设计模式

Singleton.h #define singleton_h(name) + (instancetype)shared##name; #if __has_feature (objc_arc) #define singleton_m(name) static id _instance; + (id)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^

黑马程序员——多线程下的单例设计模式的安全问题

//多线程下的单例设计模式 class Sing { //饿汉式不存在安全问题,因为其不是线程同步的 private static Sing s = new Sing(); private Sing(){} public static Sing getInstance() { return s; } } class Single { private static Single s = null; private Single(){} public static Single getInstanc

黑马程序员——多线程总结

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 多线程和进程的区别? 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高. 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率. 线程在执行过程中与进程还是有区别的.每个独立的线程有一个程序运行的入口.顺序执行序列和程序的出口.但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程

黑马程序员——多线程

一.概述 (一)进程 正在执行中的程序,每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. (二)线程 进程中的一个独立的控制单元.线程在控制着进程的执行.一个进程中至少有一个线程.只要进程中有一个线程在执行,进程就不会结束. (三)多线程 在java虚拟机启动的时候会有一个java.exe的执行程序,也就是一个进程.该进程中至少有一个线程负责java程序的执行.而且这个线程运行的代码存在于main方法中.该线程称之为主线程.JVM启动除了执行一个主线程,还有负责垃圾回收

黑马程序员 - 多线程

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 多线程进程:一个正在执行中的程序,每一个进行执行,都有一个执行顺序,该顺序就是一个执行路径,或者加一个执行单元线程:就是进程中的一个独立的执行路径,一个进程中至少有一个线程.java vm启动的时候会有一个进程java.exe.该进程中至少一个线程负责执行java程序的执行,而且这个线程运行的代码存在于main方法中.该线程称之为主线程.扩展:其中更细节说明java vm启动不止一个线程,还有