Java 线程锁的问题
并发(线程同步机制)
解决安全性问题 Synchronized
问题主要是 1.同时开门的操作(同时使用方法)
2.同时访问银行账户操作(同时使用对象)
3.同时对列表同一位置进行赋值(同时增删改查同一数据地址)
会极大影响电脑性能
- 同步方法将 synchronized 写在public 后边
- 使用块进行使用 synchronized(Obj){}
注: synchronized 锁的是this
CopyOnWriteArrayList 对于list的上锁方式
主要针对List 进行安全访问
死锁
多线程相互抱着对方需要的资源,然后形成僵持
死锁产生的四个必要条件
- 互斥条件:一个资源每次只能被一个进程使用。
- 请求与保持条件: 一个进程因请求资源而阻塞时, 对以获得的资源保持不放。
- 不剥夺条件: 进程以获得的资源, 再未使用完之前, 不能强行剥夺。
- 循环等待条件: 若干进程之间形成一种头尾相接的循环等待资源关系。
解决死锁问题 就只需要破坏其中一条或者多条件就行了。
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