教程集 www.jiaochengji.com
教程集 >  脚本编程  >  java  >  正文 java多线程的同步与多线程锁介绍

java多线程的同步与多线程锁介绍

发布时间:2016-10-31   编辑:jiaochengji.com
教程集为您提供java多线程的同步与多线程锁介绍等资源,欢迎您收藏本站,我们将为您提供最新的java多线程的同步与多线程锁介绍资源
java多线程文章我是介绍过很多但在线程同步和锁问题我们一直没有介绍过,今天看一站长分享了这个例子非常的不错,下面我们一起来看看java多线程同步问题一些例子。

线程的同步和锁的问题,我们先来看个例子,

下面的例子我们希望两个线程对m变量进行削减

<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy8491')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy8491>

packagecom.javaer.thread;
 publicclassSysTestimplementsRunnable{
intm=10;

publicstaticvoidmain(String[]args){
SysTests1=newSysTest();
Threadt1=newThread(s1,"Thread-t1");
Threadt2=newThread(s1,"Thread-t2");
t1.start();
t2.start();

}
publicvoidreduce(){
m--;
}
@Override
publicvoidrun(){
while(m&gt;0)
{
try{
Thread.sleep(1);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
this.reduce();
System.out.println(Thread.currentThread().getName() "m的值:" m);

}

}

}

Thread-t1m的值:8
Thread-t2m的值:8
Thread-t1m的值:7
Thread-t2m的值:6
Thread-t1m的值:5
Thread-t2m的值:4
Thread-t1m的值:3
Thread-t2m的值:2
Thread-t1m的值:0
Thread-t2m的值:0
两个线程不加控制的执行了reduce操作,于是出现了两个8的情况。

如果我们想线程按照一定的顺序执行,可以进行同步

同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。

这里我们对reduce操作进行锁

publicsynchronizedvoidreduce()
即可实现我们想要的。

java同步锁的原理

一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放。

同步和锁的要点
1.只能同步方法,不能同步变量和类
2.不要同步所有方法,仅仅同步必要的方法
3.如果一个synchronized方法正在被一个线程调用,其他线程不能调用,进入等待状态,只要方法被释放。
4.线程休眠的时候,不会自动释放锁
5.同步会伤害效率,多线程的目的是并发,锁的目的是反并发。所以尽可能的缩小锁的范围。
6对于非静态字段中可更改的数据,通常使用非静态方法访问。
对于静态字段中可更改的数据,通常使用静态方法访问。

什么时候需要用同步
1.访问依赖的资源,比如都要从1个任务池里领取任务的时候。
2.多个线程都会修改同一个公共变量的时候

死锁

当一个占用了锁的线程,出了问题,比如崩溃。其他等待的线程全部发生阻塞,将发生死锁,一旦发生死锁,程序就死掉。

您可能感兴趣的文章:
java多线程的同步与多线程锁介绍
经典Java线程面试题70道
Python中线程互斥锁是什么
Java多线程中的wait与notify,notifyall例子
一文读懂什么是进程、线程、协程
并发编程挑战:死锁与上下文切换
Golang 并发编程
.net 线程同步 典型场景及问题
Python之全局解释器锁GIL
go 协程

[关闭]
~ ~