线程安全。

线程状态

  • 新生状态
  • 可运行状态
  • 运行状态
  • 阻塞状态
  • 等待状态
  • 终止状态

线程同步

  1. 同步代码块
  2. 同步方法
  3. 锁机制

同步代码块

把访问的共享数据锁起来,保证线程安全

synchronized关键字可以用于方法中的某个区块中,表示对这个区块的资源实行互斥访问

//锁对象,必须是一个唯一的对象(同一个地址)
synchronized(锁对象)
    //...访问共享数据的代码...
}

**锁对象:**对象的同步锁只是一个概念,可以想象为在任意对象上标记了一个锁

建议把共享资源作为锁对象,不要随便讲无关的对象当作锁对象
对于实例方法,建议把this作为锁对象
对于静态方法,建议把类的字节码(类名.class)当作锁对象

CountDownLatch:一种同步辅助工具,允许一个或者多个线程等待,直到其他线程中执行的一组操作完成

CountDownLatch latch = new CountDownLatch(10);
latch.countDown();//每一个线程运行结束,数量减一
latch.await();//等到这个计数器中的数字清空

同步方法

使用synchronized修饰的方法就叫做同步方法,保证该线程在执行丰富的时候,其他的线程只能在方法外等着

同步方法就是将整个方法锁住,一个线程调用这个方法,另一个线程调用的时候就执行不了,只有等上一个线程调用结束,下一个线程调用才可以继续执行

同步方法也有锁对象,只不过锁对象没有显示的写出来而已
    1.对于实例方法,锁对象其实是this(也就是方法的调用者)
    2.对于静态方法,锁对象时类的字节码对象(类名.class)

同步代码块和同步方法的区别:

1.不存在哪个好与不好,只是一个锁住的范围大,一个锁住的范围小
2.同步方法是将方法中所有的代码锁住
3.同步代码块是方法中的部分代码锁住

Lock锁

JDK 5中引入了ReentrantLock, ReentrantLock重入锁,是实现Lock接口的一个类,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞,支持公平锁和非公平锁两种方式。

  • public void lock() :加同步锁
  • public void unlock():释放同步锁
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值