当前位置: 网站首页  >> 学院动态  >> 查看详情

Java多线程(1)-线程安全&Synchronized概念

发布时间:2020-06-11 17:04:19  浏览次数:1657 
1
 
进程和线程的概念

1、线程的基本概念

线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。

好处:
  • (1)易于调度。

  • (2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。

  • (3)开销少。创建线程比创建进程要快,所需开销很少

2、进程的基本状态及状态之间的关系

状态:运行、阻塞、挂起阻塞、就绪、挂起就绪

状态之间的转换:

  • (1)准备就绪的进程,被CPU调度执行,变成运行态;

  • (2)运行中的进程,进行I/O请求或者不能得到所请求的资源,变成阻塞态;

  • (3)运行中的进程,进程执行完毕(或时间片已到),变成就绪态;

  • (4)将阻塞态的进程挂起,变成挂起阻塞态,当导致进程阻塞的I/O操作在用户重启进程前完成(称之为唤醒),挂起阻塞态变成挂起就绪态,当用户在I/O操作结束之前重启进程,挂起阻塞态变成阻塞态;

  • (5)将就绪(或运行)中的进程挂起,变成挂起就绪态,当该进程恢复之后,挂起就绪态变成就绪态;

3、进程和线程的关系:

4、进程与线程的区别:

  • (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位

  • (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行

  • (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.

  • (4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

 
2
 
Java实现多线程的方式

 

 

(1) 继承Thread,重写run()方法

每次创建一个新的线程,都要新建一个Thread子类的对象
启动线程,new Thread子类().start()
创建线程实际调用的是父类Thread空参的构造器

输出结果:

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

(2) 实现Runable接口

 

(3)通过线程池创建线程

 

 

3
 
线程安全

 

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

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

 
4
 
synchronized修饰符

 

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

(2) **不使用**synchronized实例(代码A):

输出结果:

可以看到,上述的结果是不正确的,这是因为,多个线程同时操作run()方法,对count进行修改,进而造成错误。

(3) **使用**synchronized实例(代码B):

输出结果:

可以看出代码A和代码B的区别就是在run()方法上加上了synchronized修饰。

说明如下:

当多个线程访问MyThread 的run方法的时候,如果使用了synchronized修饰,那个多线程就会以排队的方式进行处理(这里排队是按照CPU分配的先后顺序而定的),一个线程想要执行synchronized修饰的方法里的代码,首先是尝试获得锁,如果拿到锁,执行synchronized代码体的内容,如果拿不到锁的话,这个线程就会不断的尝试获得这把锁,直到拿到为止,而且多个线程同时去竞争这把锁,也就是会出现锁竞争的问题。

 

 
5
 
对象锁的同步和异步

 

(1) 同步:synchronized

同步的概念就是共享,我们要知道“共享”这两个字,如果不是共享的资源,就没有必要进行同步,也就是没有必要进行加锁;

同步的目的就是为了线程的安全,其实对于线程的安全,需要满足两个最基本的特性:原子性和可见性;

(2) 异步:asynchronized

异步的概念就是独立,相互之间不受到任何制约,两者之间没有任何关系。

(3) 示例代码:

上述代码中method()就是异步的方法。

 

联系我们
在线咨询 QQ客服 0731-88362910
地址:湖南省长沙市雷锋大道1389号
如有问题,可在线提交表单