进程与线程(二)线程安全问题

目录

1.什么是线程安全问题?

2.锁机制

2.1同步方法

2.2同步代码块

2.3同步锁

3.同步方法和同步代码块的区别

4.synchronized 锁机制的原理

5.synchronized和同步锁的区别?


1.什么是线程安全问题?

多个线程同时访问一个资源(变量、代码块、数据等),可能出现线程同步问题

多个线程的执行是抢占式的,一个线程在执行一系列程序指令中途时,就被其它线程抢占,可能导致数据状态出现问题。

解决方式:锁机制

2.锁机制

synchronized 关键字

实现锁机制,可以用于修饰方法或代码块

提升数据的安全性,降低性能

2.1同步方法

public synchronized 修饰符 方法名(...){
	...
}

当第一个线程进入方法后,自动上锁,其它线程访问不了,前面线程执行完方法后,自动释放锁,其它线程就可以访问

2.2同步代码块

synchronized(锁对象){
	....
	....
}

锁对象:

1. 任意的Java对象都可以作为锁

2. 不能是局部变量

2.3同步锁

在并发包 java.concurrent.lock下存在大量的锁

Lock接口:

  • lock() 上锁
  • unlock() 解锁

常见的实现类:

  • ReentrantLock 重入锁

  • ReadLock 读锁

  • WriterLock 写锁

语法:

Lock lock = new ReentrantLock(); //成员变量

方法内:
try{
	lock.lock();
	同步的代码
}finally{
	lock.unlock();
}

3.同步方法和同步代码块的区别

1.语法不同,一个写在方法上,一个写在方法内部

2.锁粒度不同,同步方法作用于整个方法,同步代码块作用于一段代码

3.性能不同,同步方法低于同步块

4.锁对象不同,同步方法是固定的,静态就是类.class,非静态的就是this

                         同步代码块可以指定锁对象

4.synchronized 锁机制的原理

通过监视器(monitor)完成

当对方法或一段代码上锁后,会启动监视器对这段代码监控,监视器中有计数器,当计数器为0时,允许线程进入,线程进入后,计数器加1,其它线程访问时,计数器不为0,不允许线程进入,线程执行完代码块后,计数器减1为0 ,监视器允许其它线程进入。

5.synchronized和同步锁的区别?

上锁:synchronized是自动上锁和解锁,同步锁是手动完成的

性能:同步锁的性能高于synchronized

使用:synchronized使用简单,功能单一,同步锁提供更多方法,使用灵活

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值