工信部网站备案网址,自己建立网站服务器,wordpress媒体ip地址,wordpress 做一个视频站synchronized 和 Lock 都是 Java 中用于实现线程同步的机制#xff0c;它们都可以保证线程安全。
# synchronized 介绍与使用
synchronized 可用来修饰普通方法、静态方法和代码块#xff0c;当一个线程访问一个被 synchronized 修饰的方法或者代码块时#xff0c;会自动获…synchronized 和 Lock 都是 Java 中用于实现线程同步的机制它们都可以保证线程安全。
# synchronized 介绍与使用
synchronized 可用来修饰普通方法、静态方法和代码块当一个线程访问一个被 synchronized 修饰的方法或者代码块时会自动获取该对象的锁其他线程将会被阻塞直到该线程执行完毕并释放锁。这样就保证了多个线程对共享资源的操作的互斥性从而避免了数据的不一致性和线程安全问题。 synchronized 基本使用如下
public class SynchronizedDemo {private int count 0;public synchronized void increment() {count;}public synchronized int getCount() {return count;}
}此时我们再使用多线程调用上面类的 increment 或 getCount 时就不会出现线程安全问题了如下代码所示
public class SynchronizedDemoTest {public static void main(String[] args) {SynchronizedDemo demo new SynchronizedDemo();Runnable r () - {for (int i 0; i 1000; i) {demo.increment();}};Thread t1 new Thread(r);Thread t2 new Thread(r);t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Count: demo.getCount());}
}Lock 介绍与使用
Lock 是一种线程同步的机制它与 synchronized 相似可以用于控制对共享资源的访问。相比于 synchronizedLock 的特点在于更加灵活支持更多的操作。 Lock 接口定义了以下方法
lock()获取锁如果锁已被其他线程占用则阻塞当前线程。tryLock()尝试获取锁如果锁已被其他线程占用则返回 false否则返回 true。tryLock(long timeout, TimeUnit unit)尝试获取锁在指定的时间范围内获取到锁则返回 true否则返回 false。unlock()释放锁。
相比于 synchronizedLock 的优点在于
粒度更细synchronized 关键字只能对整个方法或代码块进行同步而 Lock 可以对单个变量或对象进行同步。支持公平锁synchronized 不支持公平锁而 Lock 可以通过构造函数指定锁是否是公平锁。支持多个条件变量Lock 可以创建多个条件变量即多个等待队列。
Lock 的实现类有很多比较常用的有 ReentrantLock 和 ReentrantReadWriteLock。 需要注意的是使用 Lock 时需要手动获取和释放锁否则会导致死锁等问题。因此一般来说建议使用 try-finally 语句块来确保锁的正确释放。例如
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class Counter {private int count 0;private Lock lock new ReentrantLock();public void increment() {// 加锁lock.lock();try {count;} finally {// 释放锁lock.unlock();}}public void decrement() {// 加锁lock.lock();try {count--;} finally {// 释放锁lock.unlock();}}public int getCount() {return count;}
}总结synchronized VS Lock
synchronized 和 Lock 主要的区别有以下几个方面
锁的获取方式synchronized 是隐式获取锁的即在进入 synchronized 代码块或方法时自动获取锁退出时自动释放锁而 Lock 需要程序显式地获取锁和释放锁即需要调用 lock() 方法获取锁调用 unlock() 方法释放锁。锁的性质synchronized 是可重入的互斥锁即同一个线程可以多次获得同一把锁而且锁的释放也只能由获得锁的线程来释放Lock 可以是可重入的互斥锁也可以是非可重入的互斥锁还可以是读写锁。锁的粒度synchronized 是以代码块和方法为单位进行加锁和解锁而 Lock 可以精确地控制锁的范围可以支持多个条件变量。性能在低并发的情况下synchronized 的性能优于 Lock因为 Lock 需要显式地获取和释放锁而 synchronized 是在 JVM 层面实现的在高并发的情况下Lock 的性能可能优于 synchronized因为 Lock 可以更好地支持高并发和读写分离的场景。
总的来说synchronized 的使用更加简单但是在某些场景下会受到性能的限制而 Lock 则更加灵活可以更精确地控制锁的范围和条件变量但是使用起来比较繁琐。需要根据具体的业务场景和性能需求来选择使用哪种锁机制