xqqlyx

java技术学习多线程同步

synchronized同步代码块

线程安全(thread-safe)的概念:一个类设计可以多个线程同时访问的就是线程安全的:使用锁保证线程同步。

不变类是安全的;只读不写也是安全的;就是只读是不需要同步的。读多个变量同时需要同步。

线程不安全:多线程写一个没有线程安全设计的类是不安全的。

synchronized (this) {} 等价于修饰一个方法 public synchronized void add(int n){}

静态方法锁住的是类实例 Counter.class

用synchronized修饰方法可以把整个方法变为同步代码块,synchronized方法加锁对象是this;

可重入的锁

JVM允许同一个线程重复获取同一个锁,这种能被同一个线程反复获取的锁,就叫做可重入锁。

同一个线程获得一个锁之后再次获得这个锁就是可重入锁。

不同线程互相争夺锁形成死锁。

多线程协调问题

wait和notify方法用于线程协调操作 防止多线程读写 读的时候占用锁 导致无法写 一直等待检测是不是空

读的就是wait()进入等待状态等

notify()获取要唤醒等待的

object的native方法c代码执行的

wait方法执行的时候会释放锁

返回的时候?重现试图获得锁?

就是说wait方法中断的类似? 等待状态放弃锁 恢复不等待状态才是 这个方法调用完成 就是等待其他线程的执行的

写操作:写完notify 读操作:空没有元素while wait等待

notifyAll()唤醒所有等待this锁的线程

读写操作的 协调 自身this锁之间的

不同锁之间的同步设置 以及自身读写操作this锁的协调


~~处理并发的java.util.concurrent包

ReentrantLock可重入锁: 和synchronized不同的是,ReentrantLock可以尝试获取锁:~~

创建锁

private final Lock lock = new ReentrantLock();
lock.lock();
try{

}finally{
  lock.unlock();
}
lock.tryLock(1,TimeUnit.SECONDS)

上述代码在尝试获取锁的时候,最多等待1秒。如果1秒后仍未获取到锁,tryLock()返回false,程序就可以做一些额外处理,而不是无限等待下去。

Condition和ReentrantLock等价使用synchronized 和 wait notify 完成相同的功能

在梳理的时候是要搞清楚 是那个线程的获取的那个锁 以及线程的状态变化是什么

private final Condition condition = lock.newCondition();
private final Condition condition = lock.newCondition(); condition必须从lock中获取。

posted on 2025-02-22 15:09  烫烫烫烫热  阅读(11)  评论(0)    收藏  举报