synchronized

Synchronized的基本使用

孤街浪徒 提交于 2020-01-19 03:08:55
Synchronized的作用 简单来说:就是能够保证在同一时刻最多只有一个线程执行该段代码,已达到保证并发安全的效果。 地位: 1、Synchronized是Java的关键字,被Java语言原生支持 2、是最基本的互斥同步手段 3、是并发编程中的元老级角色,是并发编程中必学内容 不使用Synchronized带来的后果 示例:两个线程同时操作一个变量,实现不断累加的效果。 public class synchronizedTest implements Runnable { static int i = 0; @Override public void run() { System.out.println("name:" + Thread.currentThread().getName()); for (int j = 0; j < 100000; j++) { i++; } } public static void main(String[] args) throws InterruptedException { synchronizedTest synchronizedTest = new synchronizedTest(); Thread thread1 = new Thread(synchronizedTest); Thread thread2 = new Thread

3.21 JAVA的高并发编程

别说谁变了你拦得住时间么 提交于 2020-01-18 14:21:53
3.21 JAVA的高并发编程 一、多线程的基本知识 1.1进程与线程的介绍(上个 博客 中已经详细介绍进程和线程)   程序运行时 在 内存中分配自己独立的运行空间 ,就是进程   线程 : 它 是位于进程中,负责当前进程中的某个具备 独立 运行资格的空间。   进程是 负责整个程序的运行,而线程是程序中具体的某个独立功能的运行。 一个 进程 中 至少 应该有一个线程 。 1.2多线程的介绍   在多任务,多用户的系统中。每天都会产生许多进程。   多线程:在 一个进程中,我们 同时 开启多个线程,让多个线程同时去完成某些 任务 ( 功能 ) 。   ( 比如后台服务系统,就可以用多个线程同时响应多个客户的请求 )   多线程的 目的: 提高程序的运行效率 。   多线程的运行原理: cpu 在线程中做 时间片 的切换( 多线程可以提高程序的运行效率,但 不能 无限制的开线程 ) 1.3 实现线程的两种方式    1 、继承 Thread 的 方式   2 、 声明实现 Runnable 接口的 方式 1.4 JAVA同步 synchronized关键字   加同步格式:   synchronized( 需要一个任意的对象(锁) ){   代码块中放操作共享数据的代码}   synchronized 是 java 中的一个关键字,也就是说是 Java 语言内置的特性。

经典笔试题:简单实现一个死锁的例子

情到浓时终转凉″ 提交于 2020-01-18 12:22:45
package com.gaopeng.multithread; /** * 简单实现一个死锁例子 * * @author gaopeng * */ public class DeadLockTest { // 创建资源 private static Object resourceA = new Object(); private static Object resourceB = new Object(); public static void main(String[] args) { // 创建线程A Thread threadA = new Thread(new Runnable() { @Override public void run() { // 获取resourceA共享资源的监视器锁 synchronized (resourceA) { System.out.println(Thread.currentThread() + " get ResourceA"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread() + " waiting get ResourceB");

Java中synchronized的同步原理

断了今生、忘了曾经 提交于 2020-01-18 05:51:23
​本文介绍在java开发中,怎么利用synchronized保证代码的同步执行,避免跳坑,废话不多说,直接上demo。 package com.helianxiaowu.demo; ​ /** * @title synchronized同步demo * @desc 注意:为了演示方便,代码中多线程使用直接new的方式,这种方式不可取,会造成服务器资源消耗。 * 工作中如果用到多线程,尽量使用线程池维护线程 * @author helianxiaowu * @date 2020/1/14 上午 11:12 */ public class SynchronizedDemo { ​ public static void main(String[] args) { ​ Demo demo = new Demo(); ​ // 启用两条线程 Thread t1 = new Thread(() -> demo.print("Thread1")); Thread t2 = new Thread(() -> demo.print("Thread2")); t1.start(); t2.start(); } ​ static class Demo { public void print(String flag) { System.out.println(flag + " start"); try {

Java多线程——线程的死锁

℡╲_俬逩灬. 提交于 2020-01-18 04:14:49
Java多线程——线程的死锁 摘要:本文主要介绍了Java多线程中遇到的死锁问题。 部分内容来自以下博客: https://www.cnblogs.com/wy697495/p/9757982.html https://www.cnblogs.com/maydow/p/4899110.html https://www.cnblogs.com/digdeep/p/4448148.html 死锁的产生 产生原因 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,而该资源又被其他线程锁定,从而导致每一个线程都得等其它线程释放其锁定的资源,造成了所有线程都无法正常结束。 必要条件 这是从网上其他文档看到的死锁产生的四个必要条件: ◆ 互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用。 ◆ 不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。 ◆ 请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。 ◆ 循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。 当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。 死锁案例 下面展示了一个死锁的代码案例,线程A拿到了资源A需要获取资源B

单例设计模式

余生颓废 提交于 2020-01-18 02:28:38
什么是单例设计模式?  单例模式,是一种常见的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式的方法创建的类在当前进程中只有一个实例。  在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。 单例模式有以下特点: 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有的其他对象提供这一实例 具体实现 需要: 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象 在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型 定义一个静态方法返回这个唯一对象 实现一:立即加载/“饿汉模式” /** * 饿汉式:在类初始化的时候,已经创建自己的实例 */ public class Singleton { //1,私有化构造方法 private Singleton(){} //2,创建自己的单例对象 private final static Singleton

写2个线程,其中一个线程打印1~52,另一个线程打印A~Z,打印顺序应该是12A34B56C...5152Z

[亡魂溺海] 提交于 2020-01-17 08:02:25
synchronized和sleep() 这是疯狂讲义多线程上的题目。 我们之前写的多线程,他都是随机分配的,那么如果解决这个,首先带大家了解一下 synchronized synchronized概念 synchronized 是 Java 中的关键字,是利用锁的机制来实现同步的。 锁机制有如下两种特性:互斥性和可见性 再这个题目中,我们用到了获取对象锁,在这里我用的是 synchronized 修饰非静态方法 需要思考的问题 为什么要使用 synchronized ? 使用 synchronized 目的是为了使方法内部执行完毕,才能获得启动另外一个资源。 为什么用sleep()而不是yield(); yield()是将资源让出,下一个是什么线程操作不一定,而sleep()是让该线程处于休眠状态,将资源让给其他线程进行执行。 Number类 package com . xiancheng ; public class Number implements Runnable { @Override public void run ( ) { // TODO Auto-generated method stub number ( ) ; } private synchronized void number ( ) { // TODO Auto-generated method

并发编程 杂记 注意点

做~自己de王妃 提交于 2020-01-17 06:54:36
注意:本文以java为编程记录 并发问题:指的是多个线程共同对数据(包括变量或代码中的数据等等)同时进行读写和写写操作时,产生的数据不统一问题,导致数据并发出现问题。 解决方式:一般对访问的代码加锁 和对变量值以volatile修饰。 1、java 两种锁synchronized和lock 1.1、代码加锁synchronized 的方式 (1)synchronized解释 synchronized是java中的一个关键字,也就是说是Java语言内置的特性。如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁。 (2)释放锁的条件 1)获取锁的线程执行完了该代码块,然后线程释放对锁的占有; 2)线程执行发生异常,此时JVM会让线程自动释放锁。 (3)synchronized 存在风险: 1)、获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了等情况下没有释放锁。其他线程便只能干巴巴地等待,影响程序执行效率。 2)、用synchronized 关键字加锁之后,无法解决读操作时线程之间发生冲突问题。(因为读读操作不会有线程多并发的问题) 3)、synchronized 相比Lock,不支持知道是否成功获取到锁的状态, 总体说lock 是比synchronized

Java2019最新面试题

落爺英雄遲暮 提交于 2020-01-15 17:19:38
2019最新整理JAVA面试题附答案 作者:Jack 包含的模块: 本文分为十九个模块,分别是:Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM 如下图所示: 共包含 208 道面试题,本文的宗旨是为读者朋友们整理一份详实而又权威的面试清单 ==================================================== 一. Java 基础模块 1.JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。 JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。 具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。简单来说:如果你需要运行 Java 程序,只需安装 JRE 就可以了,如果你需要编写 Java 程序,需要安装 JDK。 2.== 和 equals 的区别是什么

Java多线程面试题整理

◇◆丶佛笑我妖孽 提交于 2020-01-15 09:38:38
1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点。 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。 3) 如何在Java中实现线程? 1)java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行, 2)由于线程类本身就是调用的Runnable接口所以你可以继承java.lang.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。 3). 实现Callable接口通过FutureTask包装器来创建Thread线程 Callable接口(也只有一个方法)定义如下: public interface Callable<V> { V call() throws Exception; } public class SomeCallable<V>