synchronized

测试未用synchronized修饰的方法对已加锁的对象的操作能否成功

倖福魔咒の 提交于 2020-03-05 18:40:11
public class TestSync implements Runnable{ int num = 100; public static void main(String[] args){ TestSync syn = new TestSync(); Thread t = new Thread(syn); t.start(); try{ Thread.sleep(1000); } catch(InterruptedException e){ e.printStackTrace(); } syn.num = 500; System.out.println(syn.num); } public synchronized void run(){ num = 10000; try{ Thread.sleep(5000); } catch(InterruptedException e){ e.printStackTrace(); } System.out.println("num:" + num); } } 来源: https://www.cnblogs.com/yxfyg/p/12421692.html

【诡异并发三大恶人】原子性

余生颓废 提交于 2020-03-05 14:58:13
转:https://mp.weixin.qq.com/s/UiaXvnjc0NFfNMLf2lUq4A 前言、原子性的阐述 一个或者多个操作在 CPU 执行的过程中不被中断的特性称为原子性。 我理解是一个操作不可再分,即为 原子性 。而在并发编程的环境中,原子性的含义就是只要该线程开始执行这一系列操作,要么全部执行,要么全部未执行,不允许存在执行一半的情况。 我们试着从数据库事务和并发编程两个方面来进行对比: 1、在数据库中 原子性概念是这样子的:事务被当做一个不可分割的整体,包含在其中的操作要么全部执行,要么全部不执行。且事务在执行过程中如果发生错误,会被回滚到事务开始前的状态,就像这个事务没有执行一样。(也就是说:事务要么被执行,要么一个都没被执行) 2、在并发编程中 原子性概念是这样子的: 第一种理解:一个线程或进程在执行过程中,没有发生上下文切换。 上下文切换:指 CPU 从一个进程/线程切换到另外一个进程/线程(切换的前提就是获取 CPU 的使用权)。 第二种理解:我们把一个线程中的一个或多个操作(不可分割的整体),在 CPU 执行过程中不被中断的特性,称为原子性。(执行过程中,一旦发生中断,就会发生上下文切换) 从上文中对原子性的描述可以看出,并发编程和数据库两者之间的原子性概念有些相似: 都是强调,一个原子操作不能被打断! ! 而非原子操作用图片表示就是这样子的:

Java多线程死锁例子

旧城冷巷雨未停 提交于 2020-03-04 22:09:30
目录 一、产生死锁的原因 二、如何避免死锁 一、产生死锁的原因 发生死锁的情况: 多个线程需要同时占用多个共享资源而发生需要互相死循环等待的情况,就是,两个线程互相等待着对象释放锁,一直这样僵持下去,所以导致了死锁的产生。 产生死锁代码: package com . javaagent . thread ; public class DieThread implements Runnable { public static Object obj1 = new Object ( ) ; public static Object obj2 = new Object ( ) ; private boolean flag ; public DieThread ( boolean bl ) { flag = bl ; } @Override public void run ( ) { if ( flag ) { while ( true ) { synchronized ( obj1 ) { try { Thread . sleep ( 1000 ) ; } catch ( InterruptedException e ) { e . printStackTrace ( ) ; } System . out . println ( "线程" + Thread . currentThread

Java容器

瘦欲@ 提交于 2020-03-04 16:22:48
Java容器 Java中容器类可以分为两大类:Collection与Map。 Collection:存储对象的集合; Map:存储键值对。 Collection Set TreeSet 基于红黑树,支持有序性操作。 HashSet 基于哈希表实现,支持快速查找,不支持有序性操作。 LinkedHashSet 基于双向链表实现,只能顺序访问,可以快速在其中间插入和删除元素。 List ArrayList 基于动态数组实现,支持随机访问。 ArrayList源码 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable //基于数组实现,RandomAccess表示支持随机访问。 private static final int DEFAULT_CAPACITY = 10; //默认大小为10 private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if

Java常见面试题

你说的曾经没有我的故事 提交于 2020-03-04 04:24:06
Java开发岗位面试常问题 一、Java基础 1、String类为什么是final的. 2、HashMap的源码,实现原理,底层结构. 3、说说你知道的几个Java集合类:list、set、queue、map实现类咯... 4、描述一下ArrayList和LinkedList各自实现和区别 5、Java中的队列都有哪些,有什么区别. 6、反射中,Class.forName和classloader的区别 7、Java7、Java8的新特性(baidu问的,好BT) 8、Java数组和链表两种结构的操作效率,在哪些情况下(从开头开始,从结尾开始,从中间开始),哪些操作(插入,查找,删除)的效率高 9、Java内存泄露的问题调查定位:jmap,jstack的使用等等 10、string、stringbuilder、stringbuffer区别 11、hashtable和hashmap的区别 13、异常的结构,运行时异常和非运行时异常,各举个例子 14、String a= "abc" String b = "abc" String c = new String("abc") String d = "ab" + "c" .他们之间用 == 比较的结果 15、String 类的常用方法 16、Java 的引用类型有哪几种 17、抽象类和接口的区别 18、java的基础类型和字节大小. 19

JAVA JUC

非 Y 不嫁゛ 提交于 2020-03-04 03:55:54
文章目录 JAVA JUC 一、Volatile 关键字-内存可见性 1、java线程的6种状态Thread.state: 2、JAVA多线程:判断 干活 改标志位加唤醒通知(详见Thread.start()方法) 3.一共两个线程 (1)同步锁:synchronized关键字,使两个线程同步 (2)Volatile关键字 (3)Volatile与Scnchronized比较 二、原子变量与CAS算法 1、i ++ 的原子性问题:i++ 的操作实际上分为三个步骤“读-改-写” 2、原子变量:JDK1.5以后 java.util.concurrent.atomic 包下提供了常用的原子变量 (1)原子变量特性 (2)原子性的解决过程:(先读取内存值,再进行比较,再进行赋值和写入) (3)原子变量的使用: 三、模拟CAS算法 四、ConcurrentHashMap锁分段机制 1、hashmap和hashtable区别: 2、ConCurrentHashMap采用“锁分段”机制 3、CopyOnWriteArrayList/CopyOnWriteArraySet : “写入并复制” 4、CountDownLatch(==闭锁==,在完成某些运算是,只有其他所有线程的运算全部完成,当前运算才继续执行) 四、创建执行线程的方式三:实现Callable接口 五、Lock同步锁 1

Java 并发 总结

空扰寡人 提交于 2020-03-03 22:33:42
转编自: https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html Thread 控制策略 直接控制线程 交给 Executor 管理线程 线程启动 实现 Runnable 接口run 方法,调用 new Thread(Runnable).start() 运行线程;灵活,可以继承其他类 继承 Thread 类,覆盖 run 方法;不可继承其他类,不灵活 Thread.sleep(time) 暂停当前方法的运行,进入睡眠状态,让出CPU资源,此方法会抛出 InterruptException。 Thread.interrupt() 打断线程的运行状态。Thread 类有一个状态量 status ,用来表明当前线程的打断状态。 调用静态方法 Thread.interrupted() 返回 status 会重置 status ; 调用实例方法 thread.isInterrupted() 直接返回 status 状态。 thread.join() 等待线程实例结束运行。可以指定等待时间,会抛出 InterruptedExection. synchronized (同步) 目的 多线程运行可以提高程序的运行效率。但线程运行的时候访问同一个资源,那么会影响对资源的使用。

java多线程并发之synchonized

痞子三分冷 提交于 2020-03-03 16:56:59
1、Java实现多线程目的 Java中实现多线程 利计算机 多核cup并行 处理多个线程, 提升CUP的利用率,提升程序的处理速度。 当使用多线程进行并发编程时,当有共享资源时,就需要我们考虑线程安全问题。 如下图,假设改计算机有3个CUP,单对共享变量进行自增时。 cup在处理时,会将共享内存缓存到L1,L2,L3高速缓存中,当三个线程同时对i进行自增时,在缓存中拷贝的都是不可以预测,造成自增后的结果也是不可以预测,总是会小于或者等于3 public class ThreadDemo1 implements Runnable { private static int i=0; @Override public void run() { try { Thread.sleep(400); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } increment(); System.out.println("完成处理"); } public /*synchronized */void increment() { i++; } public static void main(String[] args) { ThreadDemo1 task=new

15_volatile

£可爱£侵袭症+ 提交于 2020-03-03 13:48:05
【volatile概念】 volatile关键字的主要作用是是变量在多个线程间可见。 【注意】   在java中,每一个线程都会有一块工作内存区,其中存放着所有线程共享的主内存中的变量的拷贝。当线程执行时,他在自己的工作内存区中操作这些变量。为了存取一个共享的变量,一个线程通常会先获取并去清除它的内存工作区,把这些共享变量从所有线程的共享内存区中正确地装入到他自己所在的工作内存区中,当线程解锁时保证该内存区中变量的值写回到共享内存中。   一个线程可以执行的操作有:使用(use)、赋值(assign)、装载(load)、存储(store)、锁定(lock)、解锁(unlock)。   而主内存可以执行的操作有:读(read)、写(write)、锁定(lock)、解锁(unlock),每个操作都是原子的。   volatile的作用就是强制线程到主内存(共享内存)里去读取变量,而不去线程工作内存区里去读取,从而实现了多个线程间的变量可见。也就是满足线程安全的可见性。 【线程执行流程图】 【volatile可见性的例子】 package com.higgin.part6; public class MyThread extends Thread{ /** * 加与不加volatile * 不加volatile:main线程中将isRunning设置为flase

6.并发编程--volatile

不问归期 提交于 2020-03-03 13:47:05
并发编程--volatile volatile-说明 volatile关键字的作用是变量在多个线程可见; volatile 关键字是非原子性的 要是实现原子性操作,建议使用atomic类的系列对象:支持原子性操作(注意atomic类只保证本身方法的原子性,并不保证多次操作的原子性) 1. volatile : volatile关键字的作用是变量在多个线程可见; 示例: RunThread.java 说明: 在Java中,每个线程都会有一个工作内存区域,其中存放所有线程共享的主内存中的变量的值得拷贝。当线程执行的时候,在自己的工作内存区域中操作这些变量。为了存取一个共享的变量,一个线程通常先获得锁定并清除当前线程的内存工作区域,把这些共享变量从所有线程的共享内存区域中正确的装入到本身所以在的工作内存区域中,当线程解锁是保证该工作内存中的变量的值写会到共享内存区域中。 * 一个线程可以执行的操作有:使用(use),赋值(assgin),装载(load),存储(store),锁定(lock),解锁(unlock); * 主内存中可以执行的操作有:读(read),写(write),锁定(lock),解锁(unlock); 每个操作都是原子性的。 * volatile 的作用就是强制线程到主内存(共享内存)中去读取变量,而不是去线程工作内存区域里去读取,从而实现了多个线程间的变量可见