1、公平锁、非公平锁

公平锁:非常公平、不能插队、必须先来后到

  • 非公平锁:非常不公平、可以插队、(默认非公平)

    可以修改为公平锁

2、可重入锁

拿到外边的锁、就会自动拿到里边的锁。

package com.lock;

/**
* synchronized
*/
public class Demo1 {
public static void main(String[] args) {
Phone phone = new Phone(); new Thread(()->{
phone.sms();
},"A").start(); new Thread(()->{
phone.sms();
},"B").start();
}
} class Phone{ public synchronized void sms(){
System.out.println(Thread.currentThread().getName()+"sms");
call();
} public synchronized void call(){
System.out.println(Thread.currentThread().getName()+"call"); }
}

使用lock锁

package com.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* synchronized
*/
public class Demo1 {
public static void main(String[] args) {
Phone phone = new Phone(); new Thread(()->{
phone.sms();
},"A").start(); new Thread(()->{
phone.sms();
},"B").start();
}
} class Phone{ Lock lock = new ReentrantLock(); public void sms(){
lock.lock(); try {
System.out.println(Thread.currentThread().getName()+"sms");
call();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
} public void call(){
lock.lock();
try {
System.out.println(Thread.currentThread().getName()+"call");
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
} }
}

3、自旋锁

spinlock

自己写自旋锁

package com.lock;

import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.atomic.AtomicStampedReference; public class SpinLockDemo { AtomicReference<Thread> atomicReference = new AtomicReference<>(); //加锁
public void mylock(){
Thread thread = Thread.currentThread();
System.out.println(Thread.currentThread().getName()+"mylock");
while (!atomicReference.compareAndSet(null,thread)){ }
} //解锁
public void myunlock(){
Thread thread = Thread.currentThread();
System.out.println(Thread.currentThread().getName()+"myunlock");
atomicReference.compareAndSet(thread,null); } }
package com.lock;

import java.util.concurrent.TimeUnit;

public class Test {

    public static void main(String[] args) {
SpinLockDemo spinLockDemo = new SpinLockDemo(); new Thread(()->{
spinLockDemo.mylock(); try {
TimeUnit.SECONDS.sleep(3);
} catch (Exception e) {
e.printStackTrace();
} finally {
spinLockDemo.myunlock();
} },"A").start(); new Thread(()->{
spinLockDemo.mylock();
try {
System.out.println();
} catch (Exception e) {
e.printStackTrace();
} finally {
spinLockDemo.myunlock();
} },"B").start();
}
}

4、死锁

package com.lock;

import java.util.concurrent.TimeUnit;

public class DeadLockDemo {
public static void main(String[] args) {
String lockA="lockA";
String lockB ="lockB"; new Thread(new MyThread(lockA,lockB),"T1").start();
new Thread(new MyThread(lockB,lockA),"T2").start();
} } class MyThread implements Runnable{
private String lockA;
private String lockB; public MyThread(String lockA,String lockB){
this.lockA = lockA;
this.lockB =lockB;
} @Override
public void run() {
synchronized (lockA){
System.out.println(Thread.currentThread().getName()+"lock:"+lockA+"==>"+lockB);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB){
System.out.println(Thread.currentThread().getName()+"lock:"+lockB+"==>"+lockA); }
}
}
}

测试

1、使用jps定位进程号jps -l


2、使用jstack 进程号

最新文章

  1. SubSonic3.0使用存储过程查询时,不能使用output参数返回值的问题修改
  2. Linux内核--网络栈实现分析(六)--应用层获取数据包(上)
  3. linux 下mysql的安装,并设置必要的密码
  4. 【转载】关于Linux Shell 特殊字符
  5. CSAPP2e:Shell lab 解答
  6. POJ - 1170 Shopping Offers (五维DP)
  7. 解决ScrollView 与ListView共存显示不完全的问题
  8. ionic2 tabs使用自定义图标
  9. TI-RTOS 之 PWM
  10. 使用idea新建jsp
  11. jsp填坑:找不到属性
  12. 吴恩达课后作业学习1-week2-homework-logistic
  13. 51nod-1445-变色DNA(最短路)
  14. 【mysql】连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案
  15. 如何简单区分Web前后端与MVC
  16. 关于Kafka幂等producer的讨论
  17. Java数组常用API
  18. [Jenkins] 在Jenkins执行单个test suite
  19. Android -- VelocityTracker
  20. [BZOJ2117]Crash的旅游计划

热门文章

  1. PerfView专题 (第七篇):如何洞察触发 GC 的 C# 代码?
  2. 使用STM32控制TMC5160驱动步进电机
  3. with function 语法支持
  4. 全能成熟稳定开源分布式存储Ceph破冰之旅-上
  5. 微服务低代码Serverless平台(星链)的应用实践
  6. Python数据科学手册-Numpy的结构化数组
  7. .Net7 内容汇总(1)
  8. harbor高可用部署
  9. 修改Windows10 命令终端cmd的编码为UTF-8 &amp;&amp; IDEA控制台输出中文乱码
  10. Prometheus告警处理