synchronized

Java中的锁是什么?

▼魔方 西西 提交于 2019-12-06 01:56:18
在并发编程中,经常会遇到多个线程访问同一个共享变量,当同时对共享变量进行读写操作时,就会产生数据不一致的情况。 为了解决这个问题 JDK 1.5 之前,使用 synchronized 关键字,拿到 Java 对象的锁,保护锁定的代码块。JVM 保证同一时刻只有一个线程可以拿到这个 Java 对象的锁,执行对应的代码块。 JDK 1.5 开始,引入了并发工具包 java.util.concurrent.locks.Lock,让锁的功能更加丰富。 常见的锁 synchronized 关键字锁定代码库 可重入锁 java.util.concurrent.lock.ReentrantLock 可重复读写锁 java.util.concurrent.lock.ReentrantReadWriteLock Java 中不同维度的锁分类 可重入锁 指在同一个线程在外层方法获取锁的时候,进入内层方法会自动获取锁。JDK 中基本都是可重入锁,避免死锁的发生。上面提到的常见的锁都是可重入锁。 公平锁 / 非公平锁 公平锁,指多个线程按照申请锁的顺序来获取锁。如 java.util.concurrent.lock.ReentrantLock.FairSync 非公平锁,指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程先获得锁。如 synchronized、java.util

Java中的锁是什么?

大城市里の小女人 提交于 2019-12-06 01:55:50
在并发编程中,经常会遇到多个线程访问同一个共享变量,当同时对共享变量进行读写操作时,就会产生数据不一致的情况。 为了解决这个问题 JDK 1.5 之前,使用 synchronized 关键字,拿到 Java 对象的锁,保护锁定的代码块。JVM 保证同一时刻只有一个线程可以拿到这个 Java 对象的锁,执行对应的代码块。 JDK 1.5 开始,引入了并发工具包 java.util.concurrent.locks.Lock,让锁的功能更加丰富。 常见的锁 synchronized 关键字锁定代码库 可重入锁 java.util.concurrent.lock.ReentrantLock 可重复读写锁 java.util.concurrent.lock.ReentrantReadWriteLock Java 中不同维度的锁分类 可重入锁 指在同一个线程在外层方法获取锁的时候,进入内层方法会自动获取锁。JDK 中基本都是可重入锁,避免死锁的发生。上面提到的常见的锁都是可重入锁。 公平锁 / 非公平锁 公平锁,指多个线程按照申请锁的顺序来获取锁。如 java.util.concurrent.lock.ReentrantLock.FairSync 非公平锁,指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程先获得锁。如 synchronized、java.util

java Volatile/synchronization on arraylist

我的未来我决定 提交于 2019-12-06 01:38:28
My program looks like this: public class Main { private static ArrayList<T> list; public static void main(String[] args) { new DataListener().start(); new DataUpdater().start(); } static class DataListener extends Thread { @Override public void run() { while(true){ //Reading the ArrayList and displaying the updated data Thread.sleep(5000); } } } static class DataUpdater extends Thread{ @Override public void run() { //Continuously receive data and update ArrayList; } } } In order to use this ArrayList in both threads, I know two options: To make the ArrayList volatile. However I read in this

synchronize与lock的区别

那年仲夏 提交于 2019-12-06 00:28:01
题目: S ynchronized 和Lock有什么区别?用新的ock有什么好处?你举例说说 1原始构成 synchronized是关键字属于JVM层面, moni torenter(底层是通过tmonitor对象来完成,其实wait/notify等方法也依赖Fmonitor对象只有在同步块或方法中力能漏wait/ monitorexit Lock是具体类(java. util. concurrent. locks. Lock)是api层面的锁 * 2使用方法 synchronized不需要用户去手动释放锁,当synchronized代码执 行完后系统会自动让线程释放对锁的占用 ReentrantLock则需要用户去手动释放锁若没有主动释放锁,就有可能导致出现死锁现象。 需要Lock() lnlock()方法配合try/finally语句块来完成。 3等待是否可中断 synchronized不可中断,除非抛出异常或者正常运行完成 ReentrantLock可中断,1. 设置超时方法tryLock(long timeout, TimeUnit unit) 2. lockInterruptibly()放代码块中,调用interrupt() 方法可中断 4加锁是否公平 synchronized非公平锁 Reentrantlock两者都可以,默认非公平锁,构造方法可以传入boolean值

Spring中常见的设计模式——单例模式

北慕城南 提交于 2019-12-06 00:04:45
一、单例模式的应用场景   单例模式(singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。J2EE中的ServletContext,ServletContextConfig等;Spring中的ApplicationContext、数据库连接池等。 二、饿汉式单例模式   饿汉式单例模式在类加载的时候就立即初始化,并且创建单例对象。它是绝对的线程安全、在线程还没出现以前就实现了,不可能存在访问安全问题。   优点:没有增加任何锁,执行效率高,用户体验比懒汉式好。   缺点:类加载的时候就初始化了,用不用都进行,浪费内存。   Spring 中IoC容器ApplocationContext本身就是典型的饿汉式单例模式: public class HungrySingleton { private static final HungrySingleton h = new HungrySingleton(); private HungrySingleton() { } public static HungrySingleton getInstance() { return h; } }   饿汉式单例模式适用于单例对象较少的情况。 三、懒汉式单例模式   被外部调用才会加载: public class

Java并发编程系列:Java原子类

≯℡__Kan透↙ 提交于 2019-12-05 22:57:02
一、线程不安全 当多个线程访问统一资源时,如果没有做线程同步,可能造成线程不安全,导致数据出错。举例: @Slf4j public class ThreadUnsafe { // 用于计数的统计变量 private static int count = 0; // 线程数量 private static final int Thread_Count = 10; // 线程池 private static ExecutorService executorService = Executors.newCachedThreadPool(); // 初始化值和线程数一致 private static CountDownLatch downLatch = new CountDownLatch(Thread_Count); public static void main(String[] args) throws Exception{ for (int i = 0; i < Thread_Count; i++) { executorService.execute(() -> { for (int j = 0; j < 1000; j++) { // 每个线程执行1000次++操作 count++; } // 一个线程执行完 downLatch.countDown(); }); } //

java之vector详细介绍

一世执手 提交于 2019-12-05 22:09:31
https://www.cnblogs.com/msymm/p/9873551.html 1 vector介绍 Vector简介 Vector 是 矢量队列 ,它是JDK1.0版本添加的类。继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口。 Vector 继承了AbstractList,实现了List;所以, 它是一个队列,支持相关的添加、删除、修改、遍历等功能 。 Vector 实现了RandmoAccess接口,即 提供了随机访问功能 。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。在Vector中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。 Vector 实现了Cloneable接口,即实现clone()函数。它能被克隆。 和ArrayList不同, Vector中的操作是线程安全的 。 Vector的构造函数 Vector共有4个构造函数 // 默认构造函数 Vector() // capacity是Vector的默认容量大小。当由于增加数据导致容量增加时,每次容量会增加一倍。 Vector(int capacity) // capacity是Vector的默认容量大小,capacityIncrement是每次Vector容量增加时的增量值。 Vector

synchronized原理

一个人想着一个人 提交于 2019-12-05 20:59:39
一、概念 是利用锁的机制来实现同步的。 锁机制有如下两种特性: 互斥性: 即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一个线程对需同步的代码块(复合操作)进行访问。互斥性我们也往往称为操作的原子性。 可见性: 必须确保在锁被释放之前,对共享变量所做的修改,对于随后获得该锁的另一个线程是可见的(即在获得锁时应获得最新共享变量的值),否则另一个线程可能是在本地缓存的某个副本上继续操作从而引起不一致。 二、synchronized的用法 根据修饰对象分类 1、 同步方法 (1) 同步非静态方法 Public synchronized void methodName(){ …… } (2) 同步静态方法 Public synchronized static void methodName(){ …… } 2、同步代码块   synchronized(this|object) {}   synchronized( 类.class) {}   Private final Object MUTEX =new Object();   Public void methodName(){    Synchronized (MUTEX ){   ……   }   } 根据获取的锁分类 1、获取对象锁   synchronized(this

Java 复习笔记8 - 多线程

谁都会走 提交于 2019-12-05 20:13:28
概念 关于什么是线程,进程等概念,请看下面文章: 并发/并行/阻塞/非阻塞 多进程概念 多线程概念 上述文章代码使用的是python,但是所有的概念和原理都是相同的; 需要特别强调的是Java中的线程在多核处理器上是可以真正并行执行的,没有cpython中的全局锁这么一说 线程的状态切换以及生命周期: 注意:stop方法以及被弃用建议不要使用了,线程正确的结束,应该是线程任务全部完成,或者是被作为守护线程,被守护线程运行结束,再或者调用中断方法 interrupt Java中启动线程的方式: package com.yh.lesson.collection.thread; import sun.nio.ch.ThreadPool; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class Test { public static void main(String[] args) { //1.匿名类 Thread td1 = new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName());

线程同步测试

独自空忆成欢 提交于 2019-12-05 20:07:32
public class TestSyn{ /* * 线程同步:多个对象使用同一资源,当一个线程占有资源时,其他线程不能使用该资源,进入线程阻塞,等待使用线程释放资源 * 1.当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时, 其他线程对“该对象”的该“synchronized方法”或者“synchronized代码块”的访问将被阻塞。 2.当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时, 其他线程仍然可以访问“该对象”的非同步代码块。 3.当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时, 其他线程对“该对象”的其他的“synchronized方法”或者“synchronized代码块”的访问将被阻塞。 */ public static void main(String[] args) { // tst1();//调用同一对象普通方法测试 // tst2();//调用同一对象同步方法测试 // tst3();//调用同一对象不同方法测试 // tst4();//调用同一对象不同同步方法测试 // tst5();//调用不同对象不同同步方法测试 // tst6();//调用不同对象静态同步方法测试 // tst7();/