- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java 同步锁(synchronized)详解及实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Java 同步锁(synchronized)详解及实例 。
Java中cpu分给每个线程的时间片是随机的并且在Java中好多都是多个线程共用一个资源,比如火车卖票,火车票是一定的,但卖火车票的窗口到处都有,每个窗口就相当于一个线程,这么多的线程共用所有的火车票这个资源。如果在一个时间点上,两个线程同时使用这个资源,那他们取出的火车票是一样的(座位号一样),这样就会给乘客造成麻烦。比如下面程序:
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
|
package
com.pakage.ThreadAndRunnable;
public
class
Runnable_demo
implements
Runnable{
private
int
ticket=
10
;
public
Runnable_demo(){
}
@Override
public
void
run() {
for
(
int
i=
0
;i<
20
;i++){
if
(
this
.ticket>
0
){
//休眠1s秒中,为了使效果更明显,否则可能出不了效果
try
{
Thread.sleep(
1000
);
}
catch
(Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+
"号窗口卖出:"
+
this
.ticket--+
"号票"
);
}
}
}
public
static
void
main(String args[]){
Runnable_demo demo=
new
Runnable_demo();
//基于火车票创建三个窗口
new
Thread(demo,
"a"
).start();
new
Thread(demo,
"b"
).start();
new
Thread(demo,
"c"
).start();
}
}
|
程序运行结果
我们可以看到c号窗口和和b号窗口都卖出了10号票,并且a号和b号窗口分别卖出了0号和-1号票。造成这种情况的原因是1、c线程和b线程在ticket=10的时候,c线程取出10号票以后,ticket还没来的及减1,b线程就取出了ticket此时ticket还等于10;2、在ticket=1时,c线程取出了1号票,ticket还没来的及减1,a、b线程就先后进入了if判断语句,这时ticket减1了,那么当a、b线程取票的时候就取到了0号和-1号票.
出现了上述情况怎样改变呢,我们可以这样做:当一个线程要使用火车票这个资源时,我们就交给它一把锁,等它把事情做完后在把锁给另一个要用这个资源的线程。这样就不会出现上述情况。 实现这个锁的功能就需要用到synchronized这个关键字.
synchronized这个关键字有两种用法1、放方法名前形成同步方法;2、放在块前构成同步块.
1、使用同步方法将上面的例子该为:
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
|
package
com.pakage.ThreadAndRunnable;
public
class
Runnable_demo
implements
Runnable{
private
int
ticket=
10
;
public
Runnable_demo(){
}
@Override
public
void
run() {
for
(
int
i=
0
;i<
20
;i++){
if
(
this
.ticket>
0
){
//休眠1s秒中,为了使效果更明显,否则可能出不了效果
try
{
Thread.sleep(
1000
);
}
catch
(Exception e) {
e.printStackTrace();
}
this
.sale();
}
}
}
public
synchronized
void
sale(){
if
(
this
.ticket>
0
){
System.out.println(Thread.currentThread().getName()+
"号窗口卖出:"
+
this
.ticket--+
"号票"
);
}
}
public
static
void
main(String args[]){
Runnable_demo demo=
new
Runnable_demo();
//基于火车票创建三个窗口
new
Thread(demo,
"a"
).start();
new
Thread(demo,
"b"
).start();
new
Thread(demo,
"c"
).start();
}
}
|
程序的输出结果为:
2、使用同步块修改上面的例子:
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
|
package
com.pakage.ThreadAndRunnable;
public
class
Runnable_demo
implements
Runnable{
private
int
ticket=
10
;
public
Runnable_demo(){
}
@Override
public
void
run() {
for
(
int
i=
0
;i<
20
;i++){
<span style=
"color:#ff0000"
>
synchronized
</span>(
this
){
if
(
this
.ticket>
0
){
//休眠1s秒中,为了使效果更明显,否则可能出不了效果
try
{
Thread.sleep(
1000
);
}
catch
(Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+
"号窗口卖出:"
+
this
.ticket--+
"号票"
);
}
}
}
}
public
static
void
main(String args[]){
Runnable_demo demo=
new
Runnable_demo();
//基于火车票创建三个窗口
new
Thread(demo,
"a"
).start();
new
Thread(demo,
"b"
).start();
new
Thread(demo,
"c"
).start();
}
}
|
程序的输出结果:
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! 。
原文链接:http://blog.csdn.net/qq_35101189/article/details/67634112 。
最后此篇关于Java 同步锁(synchronized)详解及实例的文章就讲到这里了,如果你想了解更多关于Java 同步锁(synchronized)详解及实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
一、公平锁和非公平锁 1.1、公平锁和非公平锁的概述 公平锁:指多个线程按照申请锁的顺序来获取锁。 非公平锁:指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁
阅读目录 1、简介 2、分类 3、全局锁 4、表级锁 5、表锁 6、元数据锁
因此,在我编写的程序中,我有三个函数,为了简单起见,我们将它们称为 A、B 和 C。每个函数都需要访问资源X才能工作。 限制是A和B不允许同时运行并且必须适当同步。但是,C 可以与 A 或 B 同时运
我听说过这些与并发编程相关的词,但是锁、互斥量和信号量之间有什么区别? 最佳答案 锁只允许一个线程进入被锁定的部分,并且该锁不与任何其他进程共享。 互斥锁与锁相同,但它可以是系统范围的(由多个进程共享
这个问题已经有答案了: What is an efficient way to implement a singleton pattern in Java? [closed] (29 个回答) 已关闭
这个问题已经有答案了: What is an efficient way to implement a singleton pattern in Java? [closed] (29 个回答) 已关闭
我对标题中的主题有几个问题。首先,假设我们使用 JDBC,并且有 2 个事务 T1 和 T2。在 T1 中,我们在一个特定的行上执行 select 语句。然后我们对该行执行更新。在事务 T2 中,我们
我希望我的函数只运行一次。这意味着如果多个线程同时调用它,该函数将阻塞所有线程,只允许它运行。 最佳答案 听起来您希望存储过程进行同步。为什么不直接将同步放在应用程序本身中。 pthread_mute
if (runInDemoMode) { lock (this) { //Initalization of tables dCreator.create
我相信无论使用什么语言都可以考虑我的问题,但是为了有一些“ anchor ”,我将使用 Java 语言来描述它。 让我们考虑以下场景:我有一个扩展 Thread 的类 PickyHost 及其实例 p
我知道异步不是并行的,但我现在遇到了一个非常有趣的情况。 async function magic(){ /* some processing here */ await async () =
我们正在使用 Scala、Play 框架和 MongoDB(以 ReactiveMongo 作为我们的驱动程序)构建一个网络应用程序。应用程序架构是端到端的非阻塞。 在我们代码的某些部分,我们需要访问
我需要一个简单的锁,JavaME 超时(concurrent.lock 的反向移植需要完整的 Java 1.3)。 如果其他人已经为 JavaME 发布了经过测试的锁定代码,我宁愿使用它。 锁定是出了
根据 boost : To access the object, a weak_ptr can be converted to a shared_ptr using the shared_ptr co
关于 Mutex 和 Critical 部分之间的区别存在一个问题,但它也不处理 Locks。 所以我想知道临界区是否可以用于进程之间的线程同步。 还有信号状态和非信号状态的含义 最佳答案 在 Win
锁 最为常见的应用就是 高并发的情况下,库存的控制。本次只做简单的单机锁介绍。 直接看代码: 每请求一次库存-1. 假如库存1000,在1000个人请求之后,库存将变为0。
线程和进程 1、线程共享创建它的进程的地址空间,进程有自己的地址空间 2、线程可以访问进程所有的数据,线程可以相互访问 3、线程之间的数据是独立的 4、子进程复制线程的数据 5、子进程启动
**摘要:**细心的你也一定关注到,有的网址是https开头的,有的是http。https开头的网站前面,会有一把小锁。这是为什么呢? 本文分享自华为云社区《还不知道SSL证书已经是刚需了?赶快来了解
试图在 C 中实现一个非常简单的互斥锁(锁)我有点困惑。我知道互斥锁类似于二进制信号量,除了互斥锁还强制执行释放锁的线程的约束,必须是最近获得它的同一线程。我对如何跟踪所有权感到困惑? 这是我到目前为
在阅读了很多与上述主题相关的文章和答案之后,我仍然想知道 SQL Server 数据库引擎在以下示例中是如何工作的: 假设我们有一个名为 t3 的表: create table t3 (a int ,
我是一名优秀的程序员,十分优秀!