synchronized

JAVA面试题汇总

◇◆丶佛笑我妖孽 提交于 2019-12-05 19:49:30
没有什么套路,就是直接上干货!!!最新Java面试题汇总整理连答案一块儿分享给大家,希望对大家有帮助~ 之后还会推出Java面试题系列文章,敬请关注! 按照技术模块:Java热点技术、多线程、微服务、JVM、Redis、消息队列、SQL相关的面试题。不要走开,稍后更精彩! 1、面向对象的特点有哪些? 抽象、继承、封装、多态。 2、接口和抽象类有什么联系和区别? 3、重载和重写有什么区别? 4、java有哪些基本数据类型? 5、数组有没有length()方法?String有没有length()方法? 数组没有length()方法,它有length属性。 String有length()方法。 集合求长度用size()方法。 6、Java支持的数据类型有哪些?什么是自动拆装箱? 7、int 和 Integer 有什么区别? 8、Java类的实例化顺序? 父类静态成员和静态代码块 -> 子类静态成员和静态代码块 -> 父类非静态成员和非静态代码块 -> 父类构造方法 -> 子类非静态成员和非静态代码块 -> 子类构造方法 9、什么是值传递和引用传递? 10、String能被继承吗?为什么? 11、String和StringBuilder、StringBuffer的区别? StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况(是线程不安全的) StringBuffer

死锁问题排查

余生长醉 提交于 2019-12-05 19:47:10
代码示例: public class Test002 { private static Object lock1 = new Object(); private static Object lock2 = new Object(); public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { synchronized (lock1) { try { System.out.println("Thread 1 start "); Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock2) { System.out.println("Thread 1 end"); } } } }).start(); new Thread(new Runnable() { @Override public void run() { synchronized (lock2) { try { System.out.println("Thread 2 start "); Thread.sleep(5000); } catch

Java面试题汇总

喜夏-厌秋 提交于 2019-12-05 19:44:13
没有什么套路,就是直接上干货!!!最新Java面试题汇总整理连答案一块儿分享给大家,希望对大家有帮助~ 之后还会推出Java面试题系列文章,敬请关注! 按照技术模块:Java热点技术、多线程、微服务、JVM、Redis、消息队列、SQL相关的面试题。不要走开,稍后更精彩! 1、面向对象的特点有哪些? 抽象、继承、封装、多态。 2、接口和抽象类有什么联系和区别? 3、重载和重写有什么区别? 4、java有哪些基本数据类型? 5、数组有没有length()方法?String有没有length()方法? 数组没有length()方法,它有length属性。 String有length()方法。 集合求长度用size()方法。 6、Java支持的数据类型有哪些?什么是自动拆装箱? 7、int 和 Integer 有什么区别? 8、Java类的实例化顺序? 父类静态成员和静态代码块 -> 子类静态成员和静态代码块 -> 父类非静态成员和非静态代码块 -> 父类构造方法 -> 子类非静态成员和非静态代码块 -> 子类构造方法 9、什么是值传递和引用传递? 10、String能被继承吗?为什么? 11、String和StringBuilder、StringBuffer的区别? StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况(是线程不安全的) StringBuffer

HashMap和Hashtable的区别

妖精的绣舞 提交于 2019-12-05 19:02:08
HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。 1、HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。 2、HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。 3、另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为

线程同步,并发

霸气de小男生 提交于 2019-12-05 17:53:46
使用锁机制(synchronized) 锁方法:锁的时this,锁当前的对象。在方法前加synchronized关键字; 锁块:锁指定对象。synchronized(object){ },锁的时object; 来源: https://www.cnblogs.com/niudaben/p/11938631.html

超细面试(妖魔鬼怪无处遁形,面试用时一个半小时)

梦想的初衷 提交于 2019-12-05 17:39:07
请画出线程的生命周期,并列出创建线程的方式 线程的5种状态:新建(New),就绪(Runnable),运行(Running),阻塞(Blocked),死亡(Dead) 创建方式:继承Thread 实现Runnable 实现Callable 使用Executors问题来了:  1. sleep结束后进入什么状态?  2. Runnable和Callable的区别?  3. FutureTask是什么  4. Executors创建的几种线程池? ThreadPoolExecutor的参数?   请描述Synchuronized关键字,列出他常用锁。 请描叙一下Volatile和Synchronized的区别。 Java 虚拟机中的同步(Synchronization)基于进入和退出管程(Monitor)对象实现 ReentrantLock 区别: volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。 volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的 volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性 volatile不会造成线程的阻塞

Concurrent code analyzer

感情迁移 提交于 2019-12-05 17:29:51
I was wondering if there is any framework or application(app)/program out there that can analyze the concurrency of any java code? If the tool knows all the implementations of the jre shipped classes and methods then it comes down to a simple analyzing of synchronized blocks and method and their call hierarchies. From here it can create a petri net and tell you for sure if you could ever experience a deadlock. Am I missing out on something or is this really so easy? Then there must be some cool tool doing that kind of stuff? Or would such a tool report too many possible deadlocks that are

简单的例子说一下死锁的问题

陌路散爱 提交于 2019-12-05 16:46:43
代码如下: /* 这里记录一下死锁的概念,意思就是两个线程 ,线程一占用了a锁,去拿b锁,线程二占用了b锁,想拿a锁,两个线程谁也没办法继续 */ static String a = "a"; static String b = "b"; public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { synchronized(a){ System.out.println("我先拿到a了,等两秒后去拿b"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("我现在去拿b"); synchronized (b){ System.out.println("a和b都拿到了-----这是不可能的"); } } } }).start(); new Thread(()->{ synchronized (b){ System.out.println("我拿到b了,等一秒去拿a"); try { Thread.sleep(1000); } catch (InterruptedException e) { e

Synchronized vs ReadWriteLock performance

馋奶兔 提交于 2019-12-05 14:39:40
I try to prove that synchronized is slower when there are many readers and only some writers. Somehow I proved the opposite. The RW example, time of execution is 313 ms: package zad3readWriteLockPerformance; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class Main { public static long start, end; public static void main(String[] args) { Runtime.getRuntime().addShutdownHook(new Thread(() -> { end = System

volatile关键字及使用场景

﹥>﹥吖頭↗ 提交于 2019-12-05 14:36:02
一、原子性、可见性和有序性 Java内存模型主要是围绕着线程并发过程中如何处理原子性、可见性和顺序性这三个特征来设计的。 1、原子性 原子性表示任意时刻只有一个线程可以执行某一段功能代码,以防止多个线程同时访问某些共享数据时,造成错误。 2、可见性 可见性是指一个线程修改了某个共享变量后,其他线程能够立刻访问到被修改后的最新数据,也就是共享数据对其他线程都是可见的。 volatile修饰的变量在修改后会立即同步到主内存,在使用时会重新从主内存中读取。volatile变量是依赖主内存为中介来保证多线程下变量对其他线程的可见性。 synchronized关键字是通过在unlock之前必须把变量同步回主内存来实现可见性的。 final关键字则是因为变量在初始化后,值就不会更改,所以只要在初始化过程中没有把this指针传递出去也能保证对其他线程的可见性。 3、有序性 程序在运行时,指令的执行顺序并不是严格按照从上到下顺序执行的,可能会进行指令重排。根据CPU流水线作业,一般来说,简单的操作会先执行,复杂的操作后执行。 有序性从不同的角度来看是不同的。单纯从单线程来看都是有序的,但到了多线程就不一样了。可以这么理解,如果在一个线程内部观察,所有操作都是有序的。但是如果在一个线程内观察另一个线程,操作可能是无序的。也就是CPU进行的指令重排序对单线程程序而言,不会有什么问题,但是对于多线程程序