Java线程 ,线程同步详解,单例

时间:2021-07-11 19:26:32

线程

                         继承了Object,implements Runnable 调用一个Run方法void run()

             如果该线程是使用了独立的Runnable运行对象构造的,则调用该Runnable对象的run方法,否则该方法不执行任何操作并返回。

1.线程是程序中的执行线程。Java虚拟机允许应用程序并发的运行多个执行程序。

2.每个线程都有一个优先级,高优先级的线程执行优先于低优先级线程。每个线程都有可能标记为一个守护线程,当某个线程中运行的代码创建一个新Thread对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线城才是守护线程,当Java虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个类的Main方法),Java虚拟机会继续执行线程,直到下列任一情况出现时为止:

             1调用了Runtime类的exit方法.并且安全管理器允许退出操作发生.

             2非守护线程的所有线程都已停止运行,无论是通过从对run方法的调用中返回.还是通过抛出一个传播到run方法之外的异常.



创建新执行线程有俩种方法

       一.继承Thread类

       二.实现Runnable接口


进程与线程

进程:是指一个正在运行的程序,有自己的地址空间.

线程:是指进程中的一个执行路径.一个进程中可以并发多个线程,共享一个内存空间,线程之间可以*切换,并发执行,一个进程最少有一个线程(单线程程序).


进程的特点:

       动态性,并发性,独立性.

进程执行时的间断性,决定了进程可能具有多种状态,事实上,运行中的进程具有以下三种基本状态.

        1.就绪状态         2.运行状态       3.阻塞状态

多线程的定义:

        进程内部的一个执行单元,他是程序中的一个单一的顺序控制流程,如果在一个线程中同时运行了多个线程,用来完成不同的工作或者各自完成各自的一样的工作,则成为多线程.

          线程和进程的区别:

              进程是系统资源分配的单位,可包括多个线程

              线程是独立调度和分配的基本单位,共享进程资源.

              引入进程是为了多个程序并发执行,提高资源的利用率和系统吞吐量.

              引入线程是为了减少程序在并发执行时付出的时空开销.

             线程是进程的组成部分,一个进程可以拥有多个线程.一个线程必须有一个父进程.线程可以拥有自己的堆栈,自己的程序计数器,和自己的局部变量,但是不拥有系统资源,他与父进程的其他线程共享该进程的所有全部 资源.

             每个线程默认的优先级都与创建它的父进程的优先级相同.默认main线程拥有普通优先级.由main线程创建的子线程也具有普通优先级.



方法:

      getPriority()返回该线程优先级

      setPriority(int x)修改优先级

  MAX-priority 10级   NorM-priority  5级    min-priority 1级 

线程同步

1.概念:

      所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其他线程也不能调用这个方法.

      在多线程编程里面,一些敏感数据不允许多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问.一百欧证数据的完整性.

2.同步代码块

   所谓代码块是指用"{}"括起来的一段代码,根据其位置和声明的不同,可以分为普通代码块,构造块,静态块,和同步代码块,如果在代码块前加上synchronized(同步对象){需要同步的代码}  同步对象一般为当前对象,即this指代.

3.同步锁

  Java提供了一种功能更强大的线程同步机制,通过显示定义同步锁对象来实现同步,在这种机制下,同步锁由Lock对象充当.

4.死锁

  当两个线程相互等待对方释放同步监视器时就会放生死所,Java虚拟机没有检测,也没有采取措施来处理死锁情况,一旦出现死锁,整个程序既不会发生任何异常,也不会给出任何提示.只是所有线程处于阻塞状态无法继续.



线程通信

1.概念

   一般而言,在一个应用程序中(即进程),一个线程往往不是孤立存在,常常需要和其他线程通信,以执行特定的任务,如主线程和次线程,次线程和次线程,工作线程和用户界面线程等.这样线程和线程间,必定有一个信息传递的渠道,这种线程间的通信不但难以避免,而且在多线程编程中也是复杂和频繁的.

2.wait方法

   导致当前想线程等待,直到其他线程调用该同步监视的notify()方法或notifyall()方法来唤醒该线程,该wait方法有三种形式-------有参无参类型

   调用wait()方法的当前进程会释放对该同步监视器的锁定.

3.notify方法

   唤醒在此同步监视器上等待的单个线程,如果所有线程都在此同步监视器上等待,则会选择唤醒其中一个线程,选择是  任意性!  的,只有当前线程放弃对该同步监视器的锁定后(使用wait方法),才可以执行被唤醒的线程.

   notifyall  唤醒所有等待线程



俩种模式演示               

恶汉式


public class xxxManager{

      private Static xxxManager   manager=new  xxxManager() ;

      private xxxmanager{}  无参构造

      public static  xxxManager   getInstance(){

                   return   manager;

       }

 

}

懒汉式


public class xxxManager{

                   private static xxxManager manager=null;

                   private xxxManager(){}

                   public static  xxxManager   getInstance(){

                             if(manager==null){

                                   manager=new xxxManager();   

                          }

                           return   manager;

                   }

}