首页 > 其他分享 >线程锁

线程锁

时间:2023-02-15 19:34:10浏览次数:37  
标签:lock synchronized Lock 线程 使用 new

Java 线程锁的问题

并发(线程同步机制)

解决安全性问题 Synchronized

问题主要是 1.同时开门的操作(同时使用方法)

	  2.同时访问银行账户操作(同时使用对象)

	  3.同时对列表同一位置进行赋值(同时增删改查同一数据地址)

会极大影响电脑性能

  1. 同步方法将 synchronized 写在public 后边
  2. 使用块进行使用 synchronized(Obj){}

注: synchronized 锁的是this

CopyOnWriteArrayList 对于list的上锁方式

主要针对List 进行安全访问

死锁

多线程相互抱着对方需要的资源,然后形成僵持

死锁产生的四个必要条件

  1. 互斥条件:一个资源每次只能被一个进程使用。
  2. 请求与保持条件: 一个进程因请求资源而阻塞时, 对以获得的资源保持不放。
  3. 不剥夺条件: 进程以获得的资源, 再未使用完之前, 不能强行剥夺。
  4. 循环等待条件: 若干进程之间形成一种头尾相接的循环等待资源关系。

解决死锁问题 就只需要破坏其中一条或者多条件就行了。

Lock锁

定义lock的对象为 ReentrantLock可重复锁

private final ReentrantLock lock = new ReentrantLock();

lock.lock()//上锁
lock.unlock//解锁

synchronized 与 Lock 的对比

Lock是显式锁(手动开启和关闭锁, 别忘记关闭锁) synchronized 是隐式锁,除了作用域自动释放。

Lock 只有代码块锁, synchronized 有代码块锁和方法锁

使用 Lock锁, JVM将花费较少的时间调度线程, 性能更好。并且具有更好的拓展性(提供更多的子类)

优先使用顺序:

Lock > 同步代码块 (已经进入了方法体, 分配了相应资源) > 同步方法 (在方法体之外)

Java 线程协作

wait() 线程等待

notify() 线程唤醒

第一种使用方法:

配合 try  finally 进行线程的等待与唤醒

第二种使用方法:

成为信号判断使用

线程池

创建服务,创建线程池

ExecutorService service = Executors.newFixedThreadpool(/*线程池大小*/10);

service.execute(new Thread());
...//重复上述操作

service.shutdown();//关闭链接


创建多线程回顾

class MyThread1 extend Thread
//创建方式
new MyThread1().start();

class MyThread2 implements Runnable
//创建方式
new Thread(MyThread2).strat();

标签:lock,synchronized,Lock,线程,使用,new
From: https://www.cnblogs.com/1618lll/p/17124415.html

相关文章