Java高并发之同步异步

1、概念理解:

2、同步的解决方案:

1).基于代码

synchronized 关键字

 修饰普通方法:作用于当前实例加锁,进入同步代码前要获得当前实例的锁。

 修饰静态方法:作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁。

修饰代码块:指定加锁对象,对给定对象加锁,进入同步代码块前要获得给定对象的锁。

code1

package com.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 同步方法
 * @author Administrator
 *
 */
public class SynchronizedMethod implements Runnable{

    //静态共享变量 i
    static int i = 0;

    /**
     * 自增
     */
    public synchronized void increase(){
        i++;
    }

    @Override
    public void run() {
        for (int j = 0; j < 100; j++) {
            increase();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        SynchronizedMethod instance = new SynchronizedMethod();
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        for (int i = 0; i < 3; i++) {
            //同一实例,线程共享静态变量i
//            executorService.execute(instance);
            //不同实例,线程单独享有变量i,达不到同步目的
            executorService.execute(new SynchronizedMethod());
            /**
             * 由于线程执行时间过短,在不同实例下,可能会得到类似于同步的结果。
             */
            Thread.sleep(100);
        }

        executorService.shutdown();

        System.out.println(i);  //300

    }
}

code2

package com.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 同步代码块
 * @author Administrator
 *
 */
public class SynchronizedCodeBlock implements Runnable{

    //静态共享变量 i
    static int i = 0;

    @Override
    public void run() {
        //同步进来的对象
        synchronized(this){  //SynchronizedCodeBlock.class
            for (int j = 0; j < 100; j++) {
                i++;
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        SynchronizedCodeBlock instance = new SynchronizedCodeBlock();
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        for (int i = 0; i < 3; i++) {
//            executorService.execute(instance);
            executorService.execute(new SynchronizedCodeBlock());
            Thread.sleep(10);
        }

        executorService.shutdown();

        System.out.println(i);  //300

    }
}

参考博客:

https://blog.csdn.net/javazejian/article/details/72828483

2).基于数据库

原文地址:https://www.cnblogs.com/x-jingxin/p/10250482.html

时间: 2024-11-04 02:54:38

Java高并发之同步异步的相关文章

java高并发之synchronized

java高并发之synchronized synchronized可以保证代码块或者方法在运行时,同一时刻只有一个方法可以进入临界区域,同时也可以保证共享变量的内存可见性 synchronized可以使用在三种情况: 1. 普通同步方法,锁是当前实例对象 2. 静态同步方法,锁是当前类的class对象 3. 同步方法块,锁是括号里面的对象 package com.tianmaying.crawler.impl; public class SynchronizedTest { public syn

Java高并发之锁优化

本文主要讲并行优化的几种方式, 其结构如下: 锁优化 减少锁的持有时间 例如避免给整个方法加锁 1 public synchronized void syncMethod(){ 2 othercode1(); 3 mutextMethod(); 4 othercode2(); 5 } 改进后 1 public void syncMethod2(){ 2 othercode1(); 3 synchronized(this){ 4 mutextMethod(); 5 } 6 othercode2()

Java高并发之设计模式.

本文主要讲解几种常见并行模式, 具体目录结构如下图. 单例 单例是最常见的一种设计模式, 一般用于全局对象管理, 比如xml配置读写之类的. 一般分为懒汉式, 饿汉式. 懒汉式: 方法上加synchronized 1 public static synchronized Singleton getInstance() { 2 if (single == null) { 3 single = new Singleton(); 4 } 5 return single; 6 } 这种方式, 由于每次获

Java高并发之无锁与Atomic源码分析

目录 CAS原理 AtomicInteger Unsafe AtomicReference AtomicStampedReference AtomicIntegerArray AtomicIntegerFieldUpdater 无锁的Vector 无锁即无障碍的运行, 所有线程都可以到达临界区, 接近于无等待. 无锁采用CAS(compare and swap)算法来处理线程冲突, 其原理如下 CAS原理 CAS包含3个参数CAS(V,E,N).V表示要更新的变量, E表示预期值, N表示新值.

Java高并发之线程池详解

线程池优势 在业务场景中, 如果一个对象创建销毁开销比较大, 那么此时建议池化对象进行管理. 例如线程, jdbc连接等等, 在高并发场景中, 如果可以复用之前销毁的对象, 那么系统效率将大大提升. 另外一个好处是可以设定池化对象的上限, 例如预防创建线程数量过多导致系统崩溃的场景. jdk中的线程池 下文主要从以下几个角度讲解: 创建线程池 提交任务 潜在宕机风险 线程池大小配置 自定义阻塞队列BlockingQueue 回调接口 自定义拒绝策略 自定义ThreadFactory 关闭线程池

关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文)

Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享给大家. 一.对于线程同步和同步锁的理解(注:分享了三篇高质量的博客) 以下我精心的挑选了几篇博文,分别是关于对线程同步的理解和如何选择线程锁以及了解线程锁的作用范围. <一>线程同步锁的选择 1. 这里我推荐下Java代码质量改进之:同步对象的选择这篇博文. 2. 以上推荐的博文是以卖火车票为例

java 同步 异步

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha 同步 就是  讲究顺序 异步 就是  可以同时进行. 不知道那个家伙起得名字.. 讲究 顺序 竟然 叫同步. 同步 字面理解  很容易 理解成 同一步骤吧 . 这样理解 恰恰 是 同时进行 的意思.   恰恰和 他们表达的 同步 异步 意思相反. 这种名字 起得 真是 醉了.  居然还能沿用这么久. 同步 异步 真是 一个梗

Java高并发编程(一)

1.原子量级操作(读.++操作.写分为最小的操作量单位,在多线程中进行原子量级编程保证程序可见性(有序性人为规定)) 由于某些问题在多线程条件下:产生了竞争的问题,(例如:在多线程中一个简单的计数器增加)如果在程序中不采用同步的机制,那么在程序的运行结果中,多个线程在访问此资源时候,产生Racing.解决这个问题,采用某种方式阻止其他线程在该线程使用该变量的时候使用该变量 采用原子级操作:1.采用加锁的机制(最好的操作)2.Java.concurrent.atomic包包含一些原子量操作:Ato

Java高并发,如何解决,什么方式解决

对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题, 但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们一起来研究一下常见的并发和同步吧. 为了更好的理解并发和同步,我们需要先明白两个重要的概念:同步和异步    1.同步和异步的区别和联系 所谓同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到 返回的值或消息后才往下执行其它的命令. 异步,执行完函数或方法