-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjava-base-date-2017-12-23-1437-ch.html
More file actions
219 lines (202 loc) · 13.1 KB
/
java-base-date-2017-12-23-1437-ch.html
File metadata and controls
219 lines (202 loc) · 13.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="kevin.xi" />
<meta name="copyright" content="kevin.xi" />
<meta name="keywords" content="java, jvm, java, " />
<title>JAVA BASE · 寒玉 Blog
</title>
<!-- <link href="http://cdn-images.mailchimp.com/embedcode/slim-081711.css" rel="stylesheet" type="text/css"> -->
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="/theme/css/style.css" media="screen">
<link rel="stylesheet" type="text/css" href="/theme/css/solarizedlight.css" media="screen">
<link rel="shortcut icon" href="/theme/images/favicon.ico" type="image/x-icon" />
<link rel="apple-touch-icon" href="/theme/images/apple-touch-icon.png" />
<link rel="apple-touch-icon" sizes="57x57" href="/theme/images/apple-touch-icon-57x57.png" />
<link rel="apple-touch-icon" sizes="72x72" href="/theme/images/apple-touch-icon-72x72.png" />
<link rel="apple-touch-icon" sizes="114x114" href="/theme/images/apple-touch-icon-114x114.png" />
<link rel="apple-touch-icon" sizes="144x144" href="/theme/images/apple-touch-icon-144x144.png" />
<link rel="icon" href="/theme/images/apple-touch-icon-144x144.png" />
</head>
<body>
<div id="content-sans-footer">
<div class="navbar navbar-static-top">
<div class="navbar-inner">
<div class="container">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="/"><span class=site-name>寒玉 Blog</span></a>
<div class="nav-collapse collapse">
<ul class="nav pull-right top-menu">
<li ><a href="">Home</a></li>
<li ><a href="/pages/books-date-2017-12-05-1130-ch.html">Books</a></li>
<li ><a href="/pages/about-date-2015-05-10-1010-ch.html">About Me</a></li>
<li ><a href="/categories.html">Categories</a></li>
<li ><a href="/tags.html">Tags</a></li>
<li ><a href="/archives.html">Archives</a></li>
<li><form class="navbar-search" action="/search.html" onsubmit="return validateForm(this.elements['q'].value);"> <input type="text" class="search-query" placeholder="Search" name="q" id="tipue_search_input"></form></li>
</ul>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row-fluid">
<div class="span1"></div>
<div class="span10">
<article>
<div class="row-fluid">
<header class="page_header span10 offset2">
<h1><a href="/java-base-date-2017-12-23-1437-ch.html"> JAVA BASE </a></h1>
</header>
</div>
<div class="row-fluid">
<div class="span8 offset2 article-content">
<h2>JAVA注解</h2>
<ul>
<li>
<p>@SuppressWarnings</p>
<p>用于抑制编译器产生警告信息<code>@SuppressWarnings(unuse)</code> & <code>@SuppressWarnings(uncheck)</code>,其注解目标为类、字段、函数、函数入参、构造函数和函数的局部变量。而家建议注解应声明在最接近警告发生的位置。</p>
</li>
<li>
<p>@Override 表示当前方法覆盖了父类的方法</p>
</li>
<li>@Deprecation 表示方法已经过时,方法上有横线,使用时会有警告。</li>
</ul>
<h2>Java多线程系列--锁</h2>
<h3><strong>Synchronized</strong></h3>
<p>Synchronized是java关键字,属于内置特性.属于悲观锁.如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况:</p>
<ul>
<li>获取锁的线程执行完了该代码块,然后线程释放对锁的占有</li>
<li>线程执行发生异常,此时JVM会让线程自动释放锁</li>
</ul>
<h3><strong>Lock</strong></h3>
<p>Lock不是java关键字,属于JAVA类</p>
<ul>
<li>Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。Lock是一个类,通过这个类可以实现同步访问; </li>
<li>Lock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。</li>
</ul>
<p>分类:<em>可重入锁</em>,<em>可中断锁</em>, <em>公平锁</em>, <em>读写锁</em>, <em>偏向锁</em>, <em>乐观锁</em>, <em>悲观锁</em></p>
<h3><strong>Lock和Synchronized的选择</strong></h3>
<ul>
<li>Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现; </li>
<li>synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁; </li>
<li>Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断; </li>
<li>通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。 </li>
<li>Lock可以提高多个线程进行读操作的效率。 </li>
</ul>
<p>在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时,此时Lock的性能要远远优于Synchronized.</p>
<h2>Java多线程系列--原子类</h2>
<p>JAVA5中的java.util.concurrent包下面有一个atomic子包,其中有几个以Atomic打头的类,可以用非阻塞的方式完成原子操作.
根据修改的数据类型.可以将juc包中的原子操作分为4类:</p>
<ol>
<li><strong>基本类型</strong>: <em>AtomicInteger</em>,<em>AtomicLong</em>, <em>AtomicBoolean</em></li>
<li><strong>数组类型</strong>: <em>AtomicIntegerArray</em>,<em>AtomicLongArray</em>, <em>AtomicReferenceArray</em></li>
<li><strong>引用类型</strong>: <em>AtomicReference</em>,<em>AtomicStampedRerence</em>, <em>AtomicMarkableReference</em></li>
<li><strong>对象的属性修改类型</strong>: <em>AtomicIntegerFieldUpdater</em>, AtomicLongFieldUpdater, <em>AtomicReferenceFieldUpdater</em></li>
</ol>
<p>这些类存在的目的是对相应的数据进行原子操作.所谓原子操作,就是操作的过程中不会被中断,保证数据是以原子方式进行的</p>
<p>AtomicLong类的incrementAndGet()方法:</p>
<div class="highlight"><pre><span></span><span class="kd">public</span> <span class="kd">final</span> <span class="kt">long</span> <span class="nf">incrementAndGet</span><span class="o">()</span> <span class="o">{</span>
<span class="k">for</span> <span class="o">(;;)</span> <span class="o">{</span>
<span class="c1">// 获取AtomicLong当前对应的long值</span>
<span class="kt">long</span> <span class="n">current</span> <span class="o">=</span> <span class="n">get</span><span class="o">();</span>
<span class="c1">// 将current加1</span>
<span class="kt">long</span> <span class="n">next</span> <span class="o">=</span> <span class="n">current</span> <span class="o">+</span> <span class="mi">1</span><span class="o">;</span>
<span class="c1">// 通过CAS函数,更新current的值</span>
<span class="k">if</span> <span class="o">(</span><span class="n">compareAndSet</span><span class="o">(</span><span class="n">current</span><span class="o">,</span> <span class="n">next</span><span class="o">))</span>
<span class="k">return</span> <span class="n">next</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="c1">// value是AtomicLong对应的long值,该值是volatile类型的变量</span>
<span class="kd">private</span> <span class="kd">volatile</span> <span class="kt">long</span> <span class="n">value</span><span class="o">;</span>
<span class="c1">// 返回AtomicLong对应的long值</span>
<span class="kd">public</span> <span class="kd">final</span> <span class="kt">long</span> <span class="nf">get</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">value</span><span class="o">;</span>
<span class="o">}</span>
<span class="c1">//incrementAndGet()接着将current加1,然后通过CAS函数,将新的值赋值给value</span>
<span class="kd">public</span> <span class="kd">final</span> <span class="kt">boolean</span> <span class="nf">compareAndSet</span><span class="o">(</span><span class="kt">long</span> <span class="n">expect</span><span class="o">,</span> <span class="kt">long</span> <span class="n">update</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">unsafe</span><span class="o">.</span><span class="na">compareAndSwapLong</span><span class="o">(</span><span class="k">this</span><span class="o">,</span> <span class="n">valueOffset</span><span class="o">,</span> <span class="n">expect</span><span class="o">,</span> <span class="n">update</span><span class="o">);</span>
<span class="o">}</span>
</pre></div>
<blockquote>
<p>CAS 操作(Compare and Swap)乐观锁.CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。</p>
</blockquote>
<p><strong>非阻塞算法</strong>:</p>
<blockquote>
<p>一个线程的失败或者挂起不应该影响其他线程的失败或者挂起的算法.</p>
</blockquote>
<h4>Java多线程系列--ThreadLocal类</h4>
<p>用于保存独立的变量.对于一个线程类,当使用ThreadLocal维护变量时候,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所有每个线程都可以独立的改变自己的副本,而不会影响其他线程所对应的副本.通常用于用户登录控制.</p>
<aside>
<hr/>
<nav>
<ul class="articles_timeline">
<li class="previous_article">« <a href="/python-code-2017-12-17-1550-ch.html" title="Previous: Python Code">Python Code</a></li>
<li class="next_article"><a href="/java-8-lambda-date-2017-12-28-9032-ch.html" title="Next: JAVA8 Lambda">JAVA8 Lambda</a> »</li>
</ul>
</nav>
</aside>
</div>
<section>
<div class="span2" style="float:right;font-size:0.9em;">
<h4>Published</h4>
<time pubdate="pubdate" datetime="2017-12-23T14:37:53+08:00">12 23, 2017</time>
<h4>Last Updated</h4>
<div class="last_updated">2017-12-23 14:37:53+08:00</div>
<h4>Category</h4>
<a class="category-link" href="/categories.html#java-ref">java</a>
<h4>Tags</h4>
<ul class="list-of-tags tags-in-article">
<li><a href="/tags.html#java-ref">java
<span>15</span>
</a></li>
<li><a href="/tags.html#jvm-ref">jvm
<span>9</span>
</a></li>
</ul>
</div>
</section>
</div>
<div id="gitalk-container"></div>
</article>
<link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css">
<script src="https://unpkg.com/gitalk/dist/gitalk.min.js"></script>
<script>
var gitalk = new Gitalk({
clientID: '55daf540951794dd3faf',
clientSecret: 'd6eaad9fa6d9e7ff2647ef8b6e21327da0cc7cda',
repo: 'blog-comment',
owner: 'xixuebin',
admin: ['xixuebin'],
id: location.pathname, // Ensure uniqueness and length less than 50
distractionFreeMode: false // Facebook-like distraction free mode
})
gitalk.render('gitalk-container')
</script>
</div>
<div class="span1"></div>
</div>
</div>
</div>
<footer>
<div id="footer">
<ul class="footer-content">
<li class="elegant-power">Powered by <a href="http://getpelican.com/" title="Pelican Home Page">Pelican</a>. Theme: <a href="http://oncrashreboot.com/pelican-elegant" title="Theme Elegant Home Page">Elegant</a> by <a href="http://oncrashreboot.com" title="Talha Mansoor Home Page">Talha Mansoor</a></li>
</ul>
</div>
</footer> <script src="https://code.jquery.com/jquery.min.js"></script>
<script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/js/bootstrap.min.js"></script>
<script>
function validateForm(query)
{
return (query.length > 0);
}
</script>
</body>
</html>