Java线程安全和锁同步知识点详解

  

<强>一、进程与线程的概念
  

  

(1)在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单位都是进程。

  

在未配置OS的系统中,程序的执行方式是顺序执行,即必须在一个程序执行完后,才允许另一个程序执行;在多道程序环境下,则允许多个程序并发执行。程序的这两种执行方式间有着显著的不同。也正是程序并发执行时的这种特征,才导致了在操作系统中引入进程的概念。

  

自从在20世纪60年代人们提出了进程的概念后,在操作系统中一直都是以进程作为能拥有资源和独立运行的基本单位的。直到20世纪80年代中期,人们又提出了比进程更小的能独立运行的基本单位——线程(线程),试图用它来提高系统内程序并发执行的程度,从而可进一步提高系统的吞吐量。特别是在进入20世纪90年代后,多处理机系统得到迅速发展,线程能比进程更好地提高程序的并行执行程度,充分地发挥多处理机的优越性,因而在近几年所推出的多处理机操作系统中也都引入了线程,以改善OS的性能。

  

(2)下图是来自知乎用户的解释:Java线程安全和锁同步概念

  

通过上述的大致了解,基本知道线程和进程是干什么的了,那么我们下边给进程和线程总结一下概念:

  

(3)进程(流程)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令,数据及其组织形式的描述,进程是程序的实体。

  

(4)线程,有时被称为轻量级进程(轻量级进程,LWP),是程序执行流的最小单元。线程是程序中一个单一的顺序控制流程。进程内一个相对独立的,可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

  

(5)进程和线程的关系:
  Java线程安全和锁同步概念
  

  

<强>二、Java实现多线程方式

  

(1)继承线程,重写运行()方法

        公共类MyThread扩展线程{      @Override   公共空间run () {   而(真){   System.out.println (this.currentThread () . getname ());   }   }      公共静态void main (String [] args) {   MyThread线程=new MyThread ();   thread.start ();//线程启动的正确方式   }   }      

输出结果:

  
  

Thread-0
  Thread-0
  Thread-0
  …

     

另外,要明白启动线程的开始是()方法而不是运行()方法,如果用运行()方法,那么他就是一个普通的方法执行了。

  

(2)实现Runable接口

        公共类MyRunnable实现Runnable {      @Override   公共空间run () {   System.out.println (“123”);   }      公共静态void main (String [] args) {   MyRunnable MyRunnable=new MyRunnable ();   线程的线程=新线程(myRunnable, t1);   thread.start ();   }   }      

<强>三、线程安全

  

线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。

  

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。这里的加锁机制常见的如:同步
  

  

<强>四、同步修饰符

  

(1)同步:可以在任意对象及方法上加锁,而加锁的这段代码称为“互斥区”或“临界区”。

  

(2)不使用同步实例(代码):

        公共类MyThread扩展线程{      私人int数=5;      @Override   公共空间run () {   数,   System.out.println (this.currentThread () . getname() +“数:”+数量);   }      公共静态void main (String [] args) {   MyThread MyThread=new MyThread ();   线程thread1=新线程(myThread thread1);   线程thread2=新线程(myThread thread2);   线程thread3=新线程(myThread thread3);   线程thread4=新线程(myThread thread4);   线程thread5=新线程(myThread thread5);   thread1.start ();   thread2.start ();   thread3.start ();   thread4.start ();   thread5.start ();   }   }

Java线程安全和锁同步知识点详解