try

多线程Lock锁

会有一股神秘感。 提交于 2019-12-09 11:01:49
  在JDK1.5以后,在并发包(java.util.concurrent)里面添加包locks,并提供了Lock接口,用于与 synchronized 类似的锁功能,不同的是Lock需要手动开启锁和释放锁。 为什么要用Lock锁? 尝试非阻塞的获取锁 获取锁的过程可以被中断 超时获取锁 Lock锁的实现类图 Lock锁的常用API lock() :加锁 lockInterruptibly() :可中断 tryLock() :尝试非阻塞的获取锁 unlock() :释放锁 public class AttemptLocking { private ReentrantLock lock = new ReentrantLock(); public void untimed() { boolean captured = lock.tryLock(); try { System.out.println("tryLock(): " + captured); } finally { if(captured) lock.unlock(); } } public void timed() { boolean captured = false; try { captured = lock.tryLock(2, TimeUnit.SECONDS); } catch

java并发系列(三)-----ReentrantLock(重入锁)功能详解和应用演示

纵然是瞬间 提交于 2019-12-09 10:56:11
1. ReentrantLock简介 jdk中独占锁的实现除了使用关键字synchronized外,还可以使用ReentrantLock。虽然在性能上ReentrantLock和synchronized没有什么区别,但ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。 2. ReentrantLock和synchronized的相同点 2.1 ReentrantLock是独占锁且可重入的 例子 public class ReentrantLockTest { public static void main(String[] args) throws InterruptedException { ReentrantLock lock = new ReentrantLock(); for (int i = 1; i <= 3; i++) { lock.lock(); } for(int i=1;i<=3;i++){ try { } finally { lock.unlock(); } } } } 上面的代码通过 lock() 方法先获取锁三次,然后通过 unlock() 方法释放锁3次,程序可以正常退出。从上面的例子可以看出,ReentrantLock是可以重入的锁,当一个线程获取锁时,还可以接着重复获取多次

ReentrantLock

﹥>﹥吖頭↗ 提交于 2019-12-09 10:55:54
  在jdk5.0之前AQS框架下的锁的性能是远远超过synchronized的,从jdk6.0开始对synchronized做出优化后二者在性能上差异已经不大了。ReentrantLock的有点在于: 灵活性。加锁解锁的过程是可控的,synchronized加锁解锁过程是编译完成后JVM来实现的 可响应中断。synchronized下无法获得锁的线程是BLOCKED的,不可以相应中断。AQS下所有的锁包括重入锁无法获得锁是WAITING的,可相应中断,可以用来解决死锁问题 超时获得锁。同样可以用来缓解死锁问题 支持公平锁避免饥饿 好基友Condition。虽然synchronized下同样有Object的wait notify方法,但Condition队列更灵活、更可控。 使用CAS来实现原子操作 使用LockSupport中的park unpark实现阻塞原语 1.1 基本使用   一个老生常谈的多线程自增的例子。由于i++的非原子性,在不采取任何措施的情况下最终的结果是小于等于200000的,为了使最终的结果为200000需要采取措施保障i++不可分割,在i++前后加锁即可。   虽然用synchronized可实现同样的结果,但用重入锁可以自己来加锁解锁,况且还省了一个大括号不是? public class myThread implements Runnable {

利用java的Socket实现一个简单hello/hi聊天程序

江枫思渺然 提交于 2019-12-08 22:26:33
利用java的Socket实现一个简单hello/hi聊天程序 首先,我们来用java实现一个简单的hello/hi聊天程序。在这个程序里,我学习到了怎么用socket套接套接字来进行编程。简单理解了一些关于socket套接字和底层调用的关系。关于java的封装思想,我学会了一些东西,java里真的是万物皆对象。还学到了一点多线程的知识。 TCP 在这里,不得不先介绍以下TCP。TCP是传输层面向连接的协议。提供了端到端的进程之间的通信方式。TCP在通信之前要先建立连接。这里我们称这个建立连接的过程为“三次握手”。如果想详细了解TCP建立连接和释放连接的过程,请参考我另一篇博客。 JavaSocket Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。抽象类SocketImpl是实现套接字的所有类的通用超类。创建客户端和服务器套接字都可以使用它。 Java在调用Socket方法的时候并不能直接调用底层的函数

利用java的Socket实现一个简单hello/hi聊天程序

拥有回忆 提交于 2019-12-08 21:51:29
利用java的Socket实现一个简单hello/hi聊天程序 首先,我们来用java实现一个简单的hello/hi聊天程序。在这个程序里,我学习到了怎么用socket套接套接字来进行编程。简单理解了一些关于socket套接字和底层调用的关系。关于java的封装思想,我学会了一些东西,java里真的是万物皆对象。还学到了一点多线程的知识。 TCP 在这里,不得不先介绍以下TCP。TCP是传输层面向连接的协议。提供了端到端的进程之间的通信方式。TCP在通信之前要先建立连接。这里我们称这个建立连接的过程为“三次握手”。如果想详细了解TCP建立连接和释放连接的过程,请参考我另一篇博客。 JavaSocket Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。抽象类SocketImpl是实现套接字的所有类的通用超类。创建客户端和服务器套接字都可以使用它。 Java在调用Socket方法的时候并不能直接调用底层的函数

【搞定面试官】try中有return,finally还会执行吗?

泄露秘密 提交于 2019-12-08 21:00:38
本篇文章我们主要探讨 一下如果 try {} 语句中有 return ,这种情况下 finally 语句还会执行吗?其实JVM规范是对这种情况有特殊规定的,那我就先上代码吧! public class FinallyTest { public int method() { int x = 1; try{ ++ x; return x; }catch(Exception e){ }finally{ ++ x; } return x; } public static void main(String[] args) { FinallyTest t = new FinallyTest(); int y = t.method(); System.out.println(y); } } 对于上述代码,我们有以下几个问题,来自测一下吧: 如果在 try 语句块里使用 return 语句,那么 finally 语句块还会执行吗? 如果执行,那么是怎样实现既执行 return 又执行 finally 的呢? 上面的程序输出是什么?为什么? finally 语句块还会执行吗 对于该问题,答案是肯定的。 Java官方文档 上是这么描述的: The finally block always executes when the try block exits.` 我们看到描述词用的是always,即在

java读取txt文档到string中

一曲冷凌霜 提交于 2019-12-08 15:09:12
Reader reader = null; BufferedReader br = null; try { reader = new FileReader("D:\\shop.txt"); br = new BufferedReader(reader); StringBuffer sb = new StringBuffer(); String data = null; while ((data = br.readLine()) != null) { sb.append(data); } } catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); br.close(); } catch (Exception e) { e.printStackTrace(); } } 来源: CSDN 作者: zyvscc 链接: https://blog.csdn.net/zyvscc/article/details/11774123

明解C语言 中级篇 第四章答案

梦想与她 提交于 2019-12-08 15:07:32
练习4-1 /* 珠玑妙算 */ #include <time.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> /*--- 生成4个不同数字的组合并存入数组x ---*/ void make4digits(int x[]) { int i, j, val; for (i = 0; i < 4; i++) { do { val = rand() % 10; /* 0~9的随机数 */ for (j = 0; j < i; j++) /* 是否已获得此数值 */ if (val == x[j]) break; } while (j < i); /* 循环直至获得不重复的数值 */ x[i] = val; } } /*--- 检查已输入的字符串s的有效性 ---*/ int check(const char s[]) { int i, j; if (strlen(s) != 4) /* 字符串长度不为4 */ return 1; for (i = 0; i < 4; i++) { if (!isdigit(s[i])) return 2; /* 包含了除数字以外的字符 */ for (j = 0; j < i; j++) if (s[i] == s[j]) return 3;

Java实现模拟发送POST、GET请求

情到浓时终转凉″ 提交于 2019-12-08 09:29:23
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — [java] view plain copy print ? import org.apache.http.HttpEntity; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.apache.log4j.Logger; import java.io

Java异常处理的九个最佳实践

回眸只為那壹抹淺笑 提交于 2019-12-08 07:03:46
1、确保在 Finally 程序块中完成资源释放或者使用 Try-With 语句 比如对于 InputStream ,当我们使用完毕,我们要确保资源被正确关闭,比如下面我们常见的错误用法,不要在 try 模块中关闭资源,因为一旦 try 语句块中的其他方法发生异常,很有可能无法执行到 inputStream.close() 方法的。 public void doNotCloseResourceInTry ( ) { FileInputStream inputStream = null ; try { File file = new File ( "./tmp.txt" ) ; inputStream = new FileInputStream ( file ) ; // use the inputStream to read a file // do NOT do this inputStream . close ( ) ; } catch ( FileNotFoundException e ) { log . error ( e ) ; } catch ( IOException e ) { log . error ( e ) ; } } 推荐做法,使用 Finally 语句块 public void closeResourceInFinally ( ) {