• Java多线程并发同步执行


    https://shop107609893.taobao.com/?spm=a2oq0.12575281.sellercard.9.16c11debh2wBGu

    https://www.cnblogs.com/pengdai/p/12026959.html

    并发关键字:volatile,final,synchronized

    Collections: 并发集合

    Executors: 线程池

    synchronized

    对象锁是用来控制实例方法之间的同步
    类锁是用来控制静态方法(或静态变量互斥体)之间的同步
    对象锁:Java的所有对象都含有1个互斥锁,这个锁由JVM自动获取和释放。线程进入synchronized方法的时候获取该对象的锁,当然如果已经有线程获取了这个对象的锁,那么当前线程会等待;synchronized方法正常返回或者抛异常而终止,JVM会自动释放对象锁。这里也体现了用synchronized来加锁的1个好处,方法抛异常的时候,锁仍然可以由JVM来自动释放。
     
    类锁:对象锁是用来控制实例方法之间的同步,类锁是用来控制静态方法(或静态变量互斥体)之间的同步。其实类锁只是一个概念上的东西,并不是真实存在的,它只是用来帮助我们理解锁定实例方法和静态方法的区别的。java类可能会有很多个对象,但是只有1个Class对象,也就是说类的不同实例之间共享该类的Class对象。Class对象其实也仅仅是1个java对象,只不过有点特殊而已。由于每个java对象都有1个互斥锁,而类的静态方法是需要Class对象。所以所谓的类锁,不过是Class对象的锁而已。
     

    类锁和对象锁不是同1个东西,一个是类的Class对象的锁,一个是类的实例的锁。也就是说:1个线程访问静态synchronized的时候,允许另一个线程访问对象的实例synchronized方法。反过来也是成立的,因为他们需要的锁是不同的。

     
     
    (1)CyclicBarrier的某个线程运行到某个点上之后,该线程即停止运行,直到所有的线程都到达了这个点,所有线程才重新运行;CountDownLatch则不是,某线程运行到某个点上之后,只是给某个数值-1而已,该线程继续运行
     
    (2)CyclicBarrier只能唤起一个任务,CountDownLatch可以唤起多个任务
     
    (3)CyclicBarrier可重用,CountDownLatch不可重用,计数值为0该CountDownLatch就不可再用了 
     
    将串行调用改为并行调用, 在有限并发级别下, 能极大提高性能
    @Component
    public class UserQueryFacade {
    @Autowired
    private FollowService followService;
    @Autowired
    private PostService postService;
    @Autowired
    private UserService userService;
     
    public User getUserDataByParallel(Long userId) throws InterruptedException, ExecutionException {
    ExecutorService executorService = Executors.newFixedThreadPool(3);
    CountDownLatch countDownLatch = new CountDownLatch(3);
    Future<User> userFuture = executorService.submit(() -> {
    try{
    return userService.get(userId);
    }finally {
    countDownLatch.countDown();
    }
    });
    Future<List<Post>> postsFuture = executorService.submit(() -> {
    try{
    return postService.getPosts(userId);
    }finally {
    countDownLatch.countDown();
    }
    });
    Future<List<User>> followersFuture = executorService.submit(() -> {
    try{
    return followService.getFollowers(userId);
    }finally {
    countDownLatch.countDown();
    }
    });
    countDownLatch.await();
    User user = userFuture.get();
    user.setFollowers(followersFuture.get());
    user.setPosts(postsFuture.get());
    return user;
    }
    }
     

  • 相关阅读:
    判断数据类型
    css----单行文本超出部分显示省略号
    IE和火狐的事件机制有什么区别
    token的验证过程
    节点
    innerHTML, innerText, outerHTML, outerText的区别
    什么是ES5?js中的'use strict'是什么?目的是什么?
    数据库连接问题
    4.EasyUI学习总结(四)——EasyUI组件使用 (通过用户登录来演示dialog、ajax的使用,serialize方法的使用,前后台怎样交互等)
    3.EasyUI学习总结(三)——easyloader源码分析
  • 原文地址:https://www.cnblogs.com/ywsheng/p/11234408.html
Copyright © 2020-2023  润新知