synchronized

(一)线程与锁

丶灬走出姿态 提交于 2020-03-07 19:25:17
一、线程的基本概念 1.1单线程 简单的说,单线程就是进程中只有一个线程。单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。 1.2多线程 由一个以上线程组成的程序称为多线程程序。常见的多线程程序如:GUI应用程序、I/O操作、网络容器等。 Java中,一定是从主线程开始执行(main方法),然后在主线程的某个位置启动新的线程。 二、线程的基本操作 2.1创建 Java中创建多线程有两种方法: 1.继承java.lang.Thread 上述代码中,MyThread类继承了类java.lang.Thread,并覆写了run方法。主线程从main方法开始执行,当主线程执行至t.start()时,启动新线程(注意此处是调用了start方法,不是run方法),新线程会并发执行自身的run方法。 2.实现java.lang.Runnable接口 上述代码中,MyThread类实现了java.lang.Runnable接口,并覆写了run方法,其它与继承java.lang.Thread完全相同。实际上,java.lang.Thread类本身也实现了Runnable接口,只不过Thread类的run方法主体里是空的,通常被子类覆写。 注意:主线程执行完成后,如果还有子线程正在执行,程序也不会结束。只有当所有线程都结束时(不包含Daemon Thread)

java 多线程 基础总结

梦想与她 提交于 2020-03-07 09:59:34
Java多线程实例 3种实现方法 Java中的多线程有三种实现方式: 1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。 2.实现Runnable接口,并实现该接口的run()方法.创建一个Thread对象,用实现的Runnable接口的对象作为参数实例化Thread对象,调用此对象的start方法。 3.实现Callable接口,重写call方法。Callable接口与Runnable接口的功能类似,但提供了比Runnable更强大的功能。有以下三点 1).Callable可以在人物结束后提供一个返回值,Runnable没有提供这个功能。 2).Callable中的call方法可以抛出异常,而Runnable的run方法不能抛出异常。 3).运行Callable可以拿到一个Future对象,表示异步计算的结果,提供了检查计算是否完成的方法。 需要注意的是,无论用那种方式实现了多线程,调用start方法并不意味着立即执行多线程代码,而是使得线程变为可运行状态。 run start的区别 start方法是启动一个线程,而线程中的run方法来完成实际的操作。 如果开发人员直接调用run方法,那么就会将这个方法当作一个普通函数来调用,并没有多开辟线程

Lock锁+CAS+与Synchronized比较

▼魔方 西西 提交于 2020-03-07 03:40:33
在大学时代接触Synchronized后,做的实验就一直用它处理线程安全问题。但是我们都知道它都是块状的粒度,粗大粗大的毛孔,喷着厚重的气息,方法执行到同步块,性能抖三抖,加在方法上,就锁住了整个实例对象,静态方法上,还锁住了整个类,所有这个类的实例对象都不能避免。monitorenter和monitorexit监视器实现的同步,虎视眈眈地看着每一个蹑手蹑脚进来的线程。步步紧跟,直到执行完同步块释放锁。 Lock()是一个接口,是Java中的更加轻量级,更加灵活的,甚至可以自定义的锁,通过实现这个接口,重写它里面的 lock() ,lockInterruptibly() , tryLock() , tryLock(long time, TimeUnit unit) , unlock() , newCondition() 这几个方法,可以实现自定义锁。 源码注释解析: * { @code Lock } implementations provide more extensive locking * operations than can be obtained using { @code synchronized } methods * and statements . They allow more flexible structuring , may have * quite

多线程笔记:同步机制(1)

有些话、适合烂在心里 提交于 2020-03-07 00:22:25
同步机制简介 线程同步机制是一套用于协调线程间的数据访问及活动的机制,该机制用于保障线程安全以及实现这些线程的共同目标。 线程同步机制是编程语言为多线程运行制定的一套规则,合理地运用这些规则可以很大程度上保障程序的正确运行。 这套机制包含两方面的内容,一是关于多线程间的数据访问的规则,二是多线程间活动的规则。前者关乎程序运行的正确与否,是相当重要的内容;后者很大程度上是影响程序的运行效率,也是不容忽视的内容。不太严谨地说,数据访问的规则主要是由锁来实现,线程间活动的规则则表现线程调度上。 锁 线程安全问题的产生前提是多个线程并发访问共享数据,那么一种保障线程安全的方法就是将多个线程对共享数据的并发访问转换为串行访问,即一个共享数据一次只能被一个线程访问,该线程访问结束后其他线程才能对其进行访问。锁就是利用这种思路来实现线程同步机制。 GoLang中换了个思路,通过通道(channel)来实现共享数据的安全性。 锁的相关概念 锁在编程里是个蛮有趣的概念。 锁:置于可启闭的器物上,以钥匙或暗码(如字码机构、时间机构、自动释放开关、磁性螺线管等)打开的扣件 —— 在线新华字典 特定代码的作用域或是 lock() 和 unlock() 方法之间的代码构成的区域就是“器物”的表征,线程访问其中的共享数据相当于解开“扣件”,打开了“器物”;通常所说“获得xx锁”,更像是获得了“钥匙或暗码

Java自学-多线程 Lock对象

♀尐吖头ヾ 提交于 2020-03-06 21:57:27
多线程 Lock对象 与synchronized类似的,lock也能够达到同步的效果 步骤 1 : 回忆 synchronized 同步的方式 首先回忆一下 synchronized 同步对象的方式 当一个线程占用 synchronized 同步对象,其他线程就不能占用了,直到释放这个同步对象为止 package multiplethread; import java.text.SimpleDateFormat; import java.util.Date; public class TestThread { public static String now(){ return new SimpleDateFormat("HH:mm:ss").format(new Date()); } public static void main(String[] args) { final Object someObject = new Object(); Thread t1 = new Thread(){ public void run(){ try { System.out.println( now()+" t1 线程已经运行"); System.out.println( now()+this.getName()+ " 试图占有对象:someObject"); synchronized

JUC-八锁现象和不安全锁

天大地大妈咪最大 提交于 2020-03-06 20:54:41
1,被 synchronized 修饰的方法,锁的对象是方法的调用者(实例对象) 2,被 static 修饰的方法,锁的对象就是 Class模板对象,这个则全局唯一 问题7: 一个普通同步方法,一个静态同步方法,只有一个手机,请问先执行sendEmail 还是 sendSMS public class LockDemo07 { public static void main(String[] args) throws InterruptedException { Phone7 phone = new Phone7(); new Thread(() -> { try { phone.sendEmail(); } catch (InterruptedException e) { e.printStackTrace(); } }, "A").start(); TimeUnit.SECONDS.sleep(1); new Thread(() -> { phone.sendSMS(); }, "B").start(); } } class Phone7 { public static synchronized void sendEmail() throws InterruptedException { TimeUnit.SECONDS.sleep(3); System.out.println

java并发简介

。_饼干妹妹 提交于 2020-03-06 18:51:25
  有的时候由于数据的同时访问,导致服务器不堪重负,这个时候就需要高并发的介入,这篇文章将会从线程,控制,监视器三个大方面来简单地介绍java的并发。 <!--原文请参考http://ifeve.com/java-concurrency-constructs/--> 线程 线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进程所创建的对象资源(内存资源)。java.lang.Thread对象负责统计和控制这种行为。 每个程序都至少拥有一个线程-即作为Java虚拟机(JVM)启动参数运行在主类main方法的线程。在Java虚拟机初始化过程中也可能启动其他的后台线程。这种线程的数目和种类因JVM的实现而异。然而所有用户级线程都是显式被构造并在主线程或者是其他用户线程中被启动。 这里对Thread类中的主要方法和属性以及一些使用注意事项作出总结。这些内容会在这本书(《Java Concurrency Constructs》)上进行进一步的讨论阐述。Java语言规范以及已发布的API文档中都会有更详细权威的描述。 构造方法 Thread类中不同的构造方法接受如下参数的不同组合: 一个Runnable对象,这种情况下,Thread.start方法将会调用对应Runnable对象的run方法。如果没有提供Runnable对象

vivo一面凉经

爷,独闯天下 提交于 2020-03-06 18:30:41
链接: https://www.nowcoder.com/discuss/112192 目录 1.手撕代码,二分查找,递归非递归 2.java反射机制,优点缺点 3.java线程同步,synchronized锁升级机制,synchronized lock区别 4.项目,感觉最难的一点,怎么解决之类的 5.看成绩单,问我成绩为什么比较差 6.java public private protected default 7.手撕代码,中序遍历,递归非递归 8.学校的一堆事,什么社团经历,最有成就感的事,最失败的事,优点缺点啥的 1.手撕代码,二分查找,递归非递归 采用非递归方式完成二分算法 public static int binarySearch(Integer[] srcArray,int des){ int low=0; int high=srcArray.length-1; while(low<=high){ int middle=(low+high); if(des==srcArray[middle]) return middle; else if(des<srcArray[middle]){ high=middle-1; }else{ low=middle+1; } } return -1; } 采用递归方式完成二分查找算法 int BinSearch(int Array[

volatile与synchronized使用比较

烈酒焚心 提交于 2020-03-06 13:38:44
volatile英文含义【易变的】其实就是告诉CPU使用前必须重新去取值。 volatile比synchronized轻量级,不会造成阻塞,但是只实现了部分synchronized的功能。 volatile能保证可见性和有序性。但是保证不了原子性。synchronized可见性、有序性、原子性都可以保证。 来源: oschina 链接: https://my.oschina.net/u/3866531/blog/1939115

字节跳动面试,问了我乐观锁和悲观锁的AQS、sync和Lock,这个回答让我拿了offer

爷,独闯天下 提交于 2020-03-06 11:35:00
前言 关于线程安全一提到可能就是加锁,在面试中也是面试官百问不厌的考察点,往往能看出面试者的基本功和是否对线程安全有自己的思考。 那锁本身是怎么去实现的呢?又有哪些加锁的方式呢? 我今天就简单聊一下乐观锁和悲观锁,他们对应的实现 CAS ,Synchronized,ReentrantLock 正文 一个120斤一身黑的小伙子走了进来,看到他微微发福的面容,看来是最近疫情伙食好运动少的结果,他难道就是今天的面试官渣渣丙? 等等难道是他?前几天刷B站看到的不会是他吧!!! 是的我已经开始把面试系列做成视频了,以后会有各种级别的面试,从大学生到阿里P7+的面试,还有阿里,拼多多,美团,字节风格的面试我也都约好人了,就差时间了,大家可以去B站搜: 三太子敖丙 观看 我也不多跟你BB了,我们直接开始好不好,你能跟我聊一下CAS么? CAS(Compare And Swap 比较并且替换)是乐观锁的一种实现方式,是一种轻量级锁,JUC 中很多工具类的实现就是基于 CAS 的。 CAS 是怎么实现线程安全的? 线程在读取数据时不进行加锁,在准备写回数据时,先去查询原值,操作的时候比较原值是否修改,若未被其他线程修改则写回,若已被修改,则重新执行读取流程。 举个栗子:现在一个线程要修改数据库的name,修改前我会先去数据库查name的值,发现name=“ 帅丙 ”,拿到值了,我们准备修改成name