??xml version="1.0" encoding="utf-8" standalone="yes"?>午夜日韩福利,久久综合久久综合久久,小草在线视频在线免费视频http://www.aygfsteel.com/zzzlyr/category/55171.htmlzh-cnWed, 24 Mar 2021 23:01:46 GMTWed, 24 Mar 2021 23:01:46 GMT60分布式锁实现-redis,zk http://www.aygfsteel.com/zzzlyr/articles/435834.html张钊?/dc:creator>张钊?/author>Wed, 24 Mar 2021 12:11:00 GMThttp://www.aygfsteel.com/zzzlyr/articles/435834.htmlhttp://www.aygfsteel.com/zzzlyr/comments/435834.htmlhttp://www.aygfsteel.com/zzzlyr/articles/435834.html#Feedback0http://www.aygfsteel.com/zzzlyr/comments/commentRss/435834.htmlhttp://www.aygfsteel.com/zzzlyr/services/trackbacks/435834.html 1:分布锁有好多实现方式
  •  Z数据库实?/li>
      q个实现方式比较复杂,考虑因素比较多,比如Q超?非公q锁,非重入等会有各种各样的问题,在解决问题的q程中会使整个方案变得越来越复杂。操作数据库需要一定的开销Q性能问题需要考虑      
  • Zredis实现(q个对于不太敏感的场景可以用,׃redis集群和单机,q有客户端,版本{多斚w因素考虑情况比较?
       性能好。用缓存实现分布式锁的~点 其数据库一?/div>
  • Zzookeeper实现(q个是最l也是最好最可靠?
       创徏临时节点Q可以解军_机,锁无法释放,非阻塞,不可冲入Q非公^的问?br /> 
    ȝ
从理解的难易E度角度Q从低到高)

数据?> ~存 > Zookeeper

从实现的复杂性角度(从低到高Q?br />
Zookeeper > ~存 > 数据?br />
从性能角度Q从高到低)

~存 > Zookeeper >= 数据?br />
从可靠性角度(从高CQ?br />
Zookeeper > ~存 > 数据?
下面讲基于redis实现分布锁代码:RedisTemplate 客户?lettuce


@Service
public class RedisDistributedLockUtils {

    @Autowired
    
private RedisTemplate redisTemplate;

    
private static final Long RELEASE_SUCCESS = 1L;

    
private static final long DEFAULT_TIMEOUT = 1000 * 10;
    
//因ؓ要用lua 脚本是因?nbsp;redis 执行lua脚本是原子操?/span>
    private static final String UNLOCK_LUA= "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";

    
/**
     * 实时获取?br />     *
     * 试获取分布式锁 redis版本升?.1以上(spring-boot-starter-data-redis 版本 2.X以上)Q然后用setIfAbsent 不存?br />     * 当setIfAbsent成功之后断开q接Q下面设|过期时间的代码 stringRedisTemplate.expire(key,timeout);是无法执行的Q这时候就会有大量没有q期旉的数据存在数据库
     * 
@param lockKey    ?br />     * @param requestId  h标识
     * 
@param expireTime 期旉
     * 
@return 是否获取成功
     
*/
    
public boolean trySetDistributedLock(String lockKey, String requestId, long expireTime) {
        
return redisTemplate.opsForValue().setIfAbsent(lockKey, requestId,0 == expireTime ? DEFAULT_TIMEOUT : expireTime, TimeUnit.MILLISECONDS);
    }

    
/**
     * 以阻塞方式的获取?br />     * 
@param key
     * 
@param value
     * 
@param timeout
     * 
@return
     
*/
    
public boolean setDistributedLock(String key, String value, long timeout) {
        Boolean lock 
= false;
        
long start = System.currentTimeMillis();
        
while (!lock && (System.currentTimeMillis() - start < timeout)) {
            
//执行set命o
            lock = redisTemplate.opsForValue().setIfAbsent(key, value, timeout, TimeUnit.MILLISECONDS);
            
//不频J去获取?/span>
            try {
                
if (!lock) {
                    Thread.sleep(
60);
                }
            } 
catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
return lock;
    }

    
public boolean releaseLock(String key, String value) {
        
// 使用Lua脚本Q先判断是否是自p|的锁,再执行删?br />        // 使用lua脚本删除redis中匹配value的keyQ可以避免由于方法执行时间过长而redis锁自动过期失效的时候误删其他线E的?br />        // spring自带的执行脚本方法中Q集模式直接抛Z支持执行脚本的异常EvalSha is not supported in cluster environment
        
// 所以只能拿到原redis的connection来执行脚?/span>

        List
<String> keys = new ArrayList<>();
        keys.add(key);
        List
<String> args = new ArrayList<>();
        args.add(value);
        Long result 
= (Long)redisTemplate.execute(new RedisCallback<Long>() {
            @Override
            
public Long doInRedis(RedisConnection connection) throws DataAccessException {
                Object nativeConnection 
= connection.getNativeConnection();
                
// 集群模式和单机模式虽然执行脚本的Ҏ一P但是没有共同的接口,所以只能分开执行
                
// 集群模式
                if (nativeConnection instanceof JedisCluster) {
                    
return (Long)((JedisCluster)nativeConnection).eval(UNLOCK_LUA, keys, args);
                }
                
//客户端是Jedis时?单机模式)
                else if (nativeConnection instanceof Jedis) {
                    
return (Long)((Jedis)nativeConnection).eval(UNLOCK_LUA, keys, args);
                }
                
//q里使用 redisTemplate 中lettuce 客户?/span>
                else{
                    DefaultRedisScript
<Long> redisScript = new DefaultRedisScript<>();
                    redisScript.setScriptText(UNLOCK_LUA);
                    redisScript.setResultType(Long.
class);
                    
return (Long)redisTemplate.execute(redisScript, keys, value);
                }
            }
        });
        
//q回最l结?/span>
        return RELEASE_SUCCESS.equals(result);
    }
}
Zzookeeper实现下期补上Q?br />

介绍分布式锁文章写的比较详细Q?br />https://blog.csdn.net/u010963948/article/details/79006572


]]>JDK 8 函数式接? Supplier、Function、Consumer、Predicatehttp://www.aygfsteel.com/zzzlyr/articles/435611.html张钊?/dc:creator>张钊?/author>Fri, 24 Jul 2020 07:46:00 GMThttp://www.aygfsteel.com/zzzlyr/articles/435611.htmlhttp://www.aygfsteel.com/zzzlyr/comments/435611.htmlhttp://www.aygfsteel.com/zzzlyr/articles/435611.html#Feedback0http://www.aygfsteel.com/zzzlyr/comments/commentRss/435611.htmlhttp://www.aygfsteel.com/zzzlyr/services/trackbacks/435611.html函数式接口的特征

1、三U方?/span>

  • 唯一的抽象方?/span>
  • 使用default定义普通方法(默认ҎQ,通过对象调用?/span>
  • 使用static定义静态方法,通过接口名调用?/span>

2、一个新注解@FunctionInterface

  • 注解@FunctionalInterface告诉~译器这是一个函数式接口Q明这个函C只有一个抽象方法,当你试在接口中~写多个抽象Ҏ的时候编译器不允许Q但是可以有多个非抽象方法?/span>

  • 不过ObjectcȝҎ可以定义为抽象方法,因ؓ接口的实现类一定是Object的子c?/span>

  • 如果接口被标注了@FunctionalInterfaceQ这个类必ȝ合函数式接口的规?/span>

  • 即一个接口没有标注@FunctionalInterfaceQ如果这个接口满_数式接口规则Q依旧被当作函数式接口?/span>

3?/span>JDK 1.8 新增加的函数接口?/span>Q?br />   

    java.util.function.*
    java.util.function 它包含了很多接口Q用来支?Java?函数式编E,它们大致分ؓ五类Q?/span>

    
   

 4、代码样?br />

    
    /**
     *JDK 8 函数式接?nbsp; Supplier、Function、Consumer、Predicate
     *
     * @param args
     * @throws Exception
     
*/

    public static void main(String[] args) throws Exception {
        ThreadPoolExecutor executor = (ThreadPoolExecutor)newFixedThreadPool(10);
        //1:JDK8以前Q通过匿名内部cd现函数式接口
        executor.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("JDK8以前Q通过匿名内部cd现函数式接口");
            }
        });
        //2:JDK8以后可以使用lambda 表达式来实现Qlambda表达式就是ؓ了优化匿名内部类而生(分开写效?
        Thread thread = new Thread(() -> System.out.println("task running !"));
        Runnable r = () -> System.out.println("JDK8以后可以使用lambda 表达式来实现Qlambda表达式就是ؓ了优化匿名内部类而生(分开写效?!");
        executor.submit(r);
        //3:合ƈh效果
        executor.submit(() -> {
            System.out.println("JDK8以后可以使用lambda 表达式来实现Qlambda表达式就是ؓ了优化匿名内部类而生!");
        });

        //4:其它 Supplier、Function、Consumer、Predicate 都可以用lambda 表达式来实现
        Supplier<String> supplier = () -> "我是SuSupplier";
        Supplier<Integer> supplier2 = () -> new Integer(1);
        System.out.println("supplier=" + supplier.get() + ";supplier2=" + supplier2.get());

        //5: Function功能型函数式接口 Function<T, R> 接受一个输入参数TQ返回一个结果R
        Function<String,Integer> function=str -> Integer.parseInt(str);
        Function<Integer,String> fun2 = item -> item+"";
        System.out.println("输入字符?nbsp;1 q回int型结果:"+function.apply("1"));
        System.out.println("输入整型 1 q回字符型结果:"+fun2.apply(2));

        //6: Consumer 一个接受单个输入参数ƈ且不q回l果的操作?nbsp;与大多数其他函数接口不同Q?nbsp;Consumer接口期望通过接受参数Q改普通对象引用?说明白点是对原来的D行加工,注意q回?nbsp;void)
        Consumer<StringBuffer> consumer= sb->sb.append("-yyy");
        StringBuffer sb1=new StringBuffer().append("111");
        consumer.accept(sb1);
        //改变sb的内部引用?/span>
        System.out.println("=========s="+sb1.toString());

        //7: Predicate<T> 断言型接口常用于集合的过滤,得到一个新的集?nbsp;Stream filter(Predicate<? super T> predicate);
        Predicate<Integer> predicate = age -> age > 18;
        Predicate<String> predicate2 = str -> str != null;
        System.out.println(predicate.test(19));
        System.out.println(predicate2.test(null));
        //我们常用集合qocd是对q个接口实现c?nbsp;其中 filter(Predicate<? super T> predicate) 用的是q个接口
        List<String> list= Lists.newArrayList("1","2","2","3","4","4","8");
        list.stream().map(s -> Long.parseLong(s)).distinct().filter(s -> s < 10).collect(Collectors.toList()).forEach(-> System.out.println(u));

        //ȝQ以上的例子其实都是JDK8 lambda 表达式简z的写法Q而且全是合ƈ写的Qƈ没有分开步骤?所有函数性接口,都可以用lambda 表达式简z写?

        
//关闭U程?/span>
        executor.shutdownNow();
    }


]]>
JDK 8 CompletableFuture 详细使用介绍http://www.aygfsteel.com/zzzlyr/articles/435608.html张钊?/dc:creator>张钊?/author>Thu, 23 Jul 2020 11:29:00 GMThttp://www.aygfsteel.com/zzzlyr/articles/435608.htmlhttp://www.aygfsteel.com/zzzlyr/comments/435608.htmlhttp://www.aygfsteel.com/zzzlyr/articles/435608.html#Feedback0http://www.aygfsteel.com/zzzlyr/comments/commentRss/435608.htmlhttp://www.aygfsteel.com/zzzlyr/services/trackbacks/435608.html

JDK 8 ?CompletableFuture 是对 Future 的增?大大化了异步~程步骤,在Spring 框架中配合@EnableAsync @Async 更加事办功倍?/span>

1:在JDK 8 之前实现多线必需实现两个接口 Runnable 不带q回|另一个Callable带返回值的接口,配合ThreadPoolTaskExecutor.submit(Callable callable) q回一个Future对象? 使用Future获得异步执行l果Ӟ要么调用dҎget()Q要么轮询看isDone()是否为trueQ这两种Ҏ都不是很好,因ؓȝE也会被q等待,而CompletableFuture出现改变了这个问题,而且提供更多q且强大的其它功能?br /> 2QCompletableFuture? CompletableFuture<T> implements Future<T>, CompletionStage<T> 其实CompletableFuture 除了实现原来的Future 接口外,其它大部分方法都是在CompletionStage? CompletableFuture cd
大致介绍下completableFuture的命名规?/span>Q?/span>

1:按功能分cȝ话:

  • xxx()Q表CҎl在已有的线E中执行Q?/span>

  • xxxAsync()Q表C将异步在线E池中执行?/span>

  • 异步执行Ҏ默认一个参数的话Q务是?nbsp;ForkJoinPool.commonPool() U程池中执行的,带executor 参数的?nbsp;executorU程池异步执行?/span>

2:按逻辑和组l方式来分话(completableFuture 中大U有50个来Ҏ)

  • 一U是 then 的逻辑Q即前一个计完成的时候调度后一个计?/span>

  • 一U是 both 的逻辑Q即{待两个计算都完成之后执行下一个计,只要能组合一个和另一个,我们可以无限复用这?+1 的逻辑l合L多的计算

  • 另一U是 either 的逻辑Q即{待两个计算的其中一个完成之后执行下一个计。注意这L计算可以说是非确定性的。因l合的两个计中先触发下一个计执行的那个会被作ؓ前一个计,而这两个前置的计到底哪一个先完成是不可预知的

3:从依赖关pd出入参数cd区别Q基本分Zc:

  • apply 字样的方式意味着l合方式?nbsp;FunctionQ即接受前一个计的l果Q应用函C后返回一个新的结?/span>

  • accept 字样的方式意味着l合方式?nbsp;ConsumerQ即接受前一个计的l果Q执行消费后不返回有意义的?/span>

  • run 字样的方式意味着l合方式?nbsp;RunnableQ即忽略前一个计的l果Q仅{待它完成后执行动作
其中出入参数主要有JDK8 FunctionQConsumer或Runnable三中函数型接?每一U都军_了是怎么样一U依赖关p?我有一文章详l介l了JDK8函数型接口用法,能有助理解completableFutureҎ使用?/span>
http://www.aygfsteel.com/zzzlyr/articles/435611.html

4:completableFuture 配合框架使用

  因ؓ自从JDK8以后增强了多U程的用便L度:
1QJDk8 的函数式接口和lambda表过?/span>
2QcompletableFuture ?Future cȝ增强?/span>
q只是JDK 基础包中的功能,现在大部分开发都在用框?java 现在基本上都在用spring框架Q因为JDK基础包中的功能还是不如框架用方便,下边文章详细介绍 springboot中对JDK基础包中多线E功能配|和使用?
http://www.aygfsteel.com/zzzlyr/articles/435305.html





]]>
SpringBoot异步及线E池配置(jdk8新增加线E支持CompletableFuture)http://www.aygfsteel.com/zzzlyr/articles/435305.html张钊?/dc:creator>张钊?/author>Wed, 25 Mar 2020 12:19:00 GMThttp://www.aygfsteel.com/zzzlyr/articles/435305.htmlhttp://www.aygfsteel.com/zzzlyr/comments/435305.htmlhttp://www.aygfsteel.com/zzzlyr/articles/435305.html#Feedback0http://www.aygfsteel.com/zzzlyr/comments/commentRss/435305.htmlhttp://www.aygfsteel.com/zzzlyr/services/trackbacks/435305.html阅读全文

]]>
JAVA 泛型ȝQ?/title><link>http://www.aygfsteel.com/zzzlyr/articles/424765.html</link><dc:creator>张钊?/dc:creator><author>张钊?/author><pubDate>Wed, 29 Apr 2015 10:18:00 GMT</pubDate><guid>http://www.aygfsteel.com/zzzlyr/articles/424765.html</guid><wfw:comment>http://www.aygfsteel.com/zzzlyr/comments/424765.html</wfw:comment><comments>http://www.aygfsteel.com/zzzlyr/articles/424765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zzzlyr/comments/commentRss/424765.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zzzlyr/services/trackbacks/424765.html</trackback:ping><description><![CDATA[<div></div> <p style="line-height:150%"><span style="font-size: 18pt; line-height: 150%; font-family: Verdana, sans-serif;">1</span><span style="font-size: 18pt; line-height: 150%; font-family: 宋体;">Q今天偶想起了泛型Q都快忘C在次ȝ下!</span><span style="font-size: 18pt; line-height: 150%; font-family: Verdana, sans-serif;"><br /> </span>JAVA <span style="font-size: 18pt; line-height: 150%; font-family: 宋体;">泛型分ؓQ泛型类Q泛型接口,泛型ҎQ泛型承;</span><span style="font-size: 18pt; line-height: 150%; font-family: Verdana, sans-serif;"><br /> </span>泛型q可以限制参数类型的上下限等<span style="font-size: 18pt; line-height: 150%; font-family: Verdana, sans-serif;"><br /> </span>1<span style="font-size: 18pt; line-height: 150%; font-family: 宋体;">Q自定义cL?/span><span style="font-size: 18pt; line-height: 150%; font-family: Verdana, sans-serif;"><br /> </span>public class GenericTest<T><br /> 2: <span style="font-size: 18pt; line-height: 150%; font-family: 宋体;">泛型接口</span><span style="font-size: 18pt; line-height: 150%; font-family: Verdana, sans-serif;">(</span><span style="font-size: 18pt; line-height: 150%; font-family: 宋体;">也可以自定义</span><span style="font-size: 18pt; line-height: 150%; font-family: Verdana, sans-serif;">)</span><span style="font-size: 18pt; line-height: 150%; font-family: 宋体;">Q泛型?/span><span style="font-size: 18pt; line-height: 150%; font-family: Verdana, sans-serif;"><br /> </span>public interface List<E> extends Collection<E> <br /> 3<span style="font-size: 18pt; line-height: 150%; font-family: 宋体;">Q泛型方?/span><span style="font-size: 18pt; line-height: 150%; font-family: Verdana, sans-serif;"><br /> </span>public <T> List<T> getListBykey(String key, Class<?> T)<br /> 4<span style="font-size: 18pt; line-height: 150%; font-family: 宋体;">Q泛型限制参数类型上下限Q例泛型cd只能?/span><span style="font-size: 18pt; line-height: 150%; font-family: Verdana, sans-serif;">String </span><span style="font-size: 18pt; line-height: 150%; font-family: 宋体;">cd子类Q?/span><span style="font-size: 18pt; line-height: 150%; font-family: Verdana, sans-serif;"><br /> </span>上限<span style="font-size: 18pt; line-height: 150%; font-family: Verdana, sans-serif;"><br /> </span>public class GenericTest<?extends String> <br /> 下限Q?span style="font-size: 18pt; line-height: 150%; font-family: Verdana, sans-serif;"><br /> </span>public class GenericTest<? super  String>  <br /> 其中<span style="font-size: 18pt; line-height: 150%; font-family: Verdana, sans-serif;">?</span><span style="font-size: 18pt; line-height: 150%; font-family: 宋体;">是通配W,代表Lcd</span></p> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div><img src ="http://www.aygfsteel.com/zzzlyr/aggbug/424765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zzzlyr/" target="_blank">张钊?/a> 2015-04-29 18:18 <a href="http://www.aygfsteel.com/zzzlyr/articles/424765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">½</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¤</a>| <a href="http://" target="_blank">Ͷ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">կ</a>| <a href="http://" target="_blank">ͷ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ع</a>| <a href="http://" target="_blank">ֶ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̶</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ֱ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͬ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">㶫ʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ٸ</a>| <a href="http://" target="_blank">½</a>| <a href="http://" target="_blank">ɣֲ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˫</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>