网站首页 > 文章中心 > 其它

java静态同步代码教程_Java同步代码块

作者:小编 更新时间:2023-10-09 07:39:18 浏览量:467人看过

JAVA中线程同步方法有哪些

JAVA中线程同步方法一般有以下三种:

①. wait方法:

该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行).

调用wait方法需要注意几点:

第一点:wait被调用的时候必须在拥有锁(即synchronized修饰的)的代码块中.

第二点:恢复执行后,从wait的下一条语句开始执行,因而wait方法总是应当在while循环中调用,以免出现恢复执行后继续执行的条件不满足却继续执行的情况.

第三点:若wait方法参数中带时间,则除了notify和notifyAll被调用能激活处于wait状态(等待状态)的线程进入锁竞争外,在其他线程中interrupt它或者参数时间到了之后,该线程也将被激活到竞争状态.

java静态同步代码教程_Java同步代码块-图1

第四点:wait方法被调用的线程必须获得之前执行到wait时释放掉的锁重新获得才能够恢复执行.

notify方法通知调用了wait方法,但是尚未激活的一个线程进入线程调度队列(即进入锁竞争),注意不是立即执行.并且具体是哪一个线程不能保证.另外一点就是被唤醒的这个线程一定是在等待wait所释放的锁.

notifyAll方法则唤醒所有调用了wait方法,尚未激活的进程进入竞争队列.

java静态同步代码教程_Java同步代码块-图2

第一点:synchronized用来标识一个普通方法时,表示一个线程要执行该方法,必须取得该方法所在的对象的锁.

第二点:synchronized用来标识一个静态方法时,表示一个线程要执行该方法,必须获得该方法所在的类的类锁.

第三点:synchronized修饰一个代码块.类似这样:synchronized(obj) { //code.... }.表示一个线程要执行该代码块,必须获得obj的锁.这样做的目的是减小锁的粒度,保证当不同块所需的锁不冲突时不用对整个对象加锁.利用零长度的byte数组对象做obj非常经济.

java多线程中,如何给静态变量(如List)加锁/同步

使用synchronized关键字同步方法就可以了.

private int x = 100;

public int getX() {

return x;

}

//同步方法

public synchronized int fix(int y) {

x = x - y;

System.out.println("线程"+Thread.currentThread().getName() + "运行结束,减少"" + y + "",当前值为:" + x);

java中实现同步的方法有哪两种?

Java的同步可以用synchronized关键字来实现.\x0d\x0a \x0d\x0asychronized可以同步代码,需要绑定一个对象,如synchronized(obj){}\x0d\x0a也可以同步一个方法,是对方法进行线程同步.如public void synchronized methodA(){}

java 总结几种线程异步转同步的方法

以Java语言为例:

用synchronized关键字修饰同步方法.

同步有几种实现方法分别是synchronized,wait与notify

wait():使一个线程处于等待状态,并且释放所持有的对象的lock.

java静态同步代码教程_Java同步代码块-图3

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常.

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级.

Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争.

同步是多线程中的重要概念.同步的使用可以保证在多线程运行的环境中,程序不会产生设计之外的错误结果.同步的实现方式有两种,同步方法和同步块,这两种方式都要用到synchronized关键字.

给一个方法增加synchronized修饰符之后就可以使它成为同步方法,这个方法可以是静态方法和非静态方法,但是不能是抽象类的抽象方法,也不能是接口中的接口方法.下面代码是一个同步方法的示例:

public synchronized void aMethod() {

// do something

public static synchronized void anotherMethod() {

线程在执行同步方法时是具有排它性的.当任意一个线程进入到一个对象的任意一个同步方法时,这个对象的所有同步方法都被锁定了,在此期间,其他任何线程都不能访问这个对象的任意一个同步方法,直到这个线程执行完它所调用的同步方法并从中退出,从而导致它释放了该对象的同步锁之后.在一个对象被某个线程锁定之后,其他线程是可以访问这个对象的所有非同步方法的.

同步块是通过锁定一个指定的对象,来对同步块中包含的代码进行同步;而同步方法是对这个方法块里的代码进行同步,而这种情况下锁定的对象就是同步方法所属的主体对象自身.如果这个方法是静态同步方法呢?那么线程锁定的就不是这个类的对象了,也不是这个类自身,而是这个类对应的java.lang.Class类型的对象.同步方法和同步块之间的相互制约只限于同一个对象之间,所以静态同步方法只受它所属类的其它静态同步方法的制约,而跟这个类的实例(对象)没有关系.

以上就是土嘎嘎小编为大家整理的java静态同步代码教程相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章