java如何实现线程同步的简单介绍
本篇文章给大家谈谈java如何实现线程同步,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
java中线程同步的几种方法
线程同步主要有以下种方法(示例中是实现计数的功能):
1、同步方法,即使用synchronized关键字修饰方法,例如:
public synchronized void add(int c){...}
2、同步代码块,即有synchronized关键字修饰的语句块,例如:
public void addAndGet(int c){
synchronized(this){
count += c;
}
}
3、使用特殊域变量(volatile)实现线程同步,该方法不能保证绝对的同步。
例如:private volatile int count = 0;
4、使用锁实现线程同步,例如:
private Lock lock = new ReentrantLock();
public void add(int c) {
lock.lock();//上锁
try{
count += c;
}finally{
lock.unlock();//解锁
}
}
5、使用原子变量实现线程同步,在java的util.concurrent.atomic包中提供了创建了原子类型变量的工具类,例如:
private AtomicInteger count= new AtomicInteger(1);
public void add(int c) {
count.addAndGet(c);
}
6、使用局部变量实现线程同步,如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本, 副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。
ThreadLocal 类的常用方法
new ThreadLocalT() : 创建一个线程本地变量
get() : 返回此线程局部变量的当前线程副本中的值
initialValue() : 返回此线程局部变量的当前线程的"初始值"
set(T value) : 将此线程局部变量的当前线程副本中的值设置为value
示例代码:
private static ThreadLocalInteger count= new ThreadLocalInteger(){
@Override
protected Integer initialValue(){
return 1;
}
};
public void add(int c){
count.set(count.get() + c);
}
7、使用阻塞队列实现,例如LinkedBlockingQueue,具体使用可百度LinkedBlockingQueue的用法或查看java文档。
Java类的实例化顺序是什么样的?Java线程同步的方式有哪些?
引言:java是在1990年初 ,被詹姆斯•高斯林等人开发的一门面向对象的编程语言。起初,java被称为0ak,来经过发展0ak改名为java,与1995年的五月份正式向大家发布。
一、java类的实例化顺序
java的实例化顺序在继承没有的情况
单独一个类的场景下,初始化顺序为依次为静态数据,继承的基类的构造函数,成员变量,被调用的构造函数。
其中静态数据只会初始化一次。(静态数据包括静态代码块和静态变量,每个类的静态数据只会初始化一次)
在继承的情况下
添加两个基类,让继承父亲,父亲继承祖父。
继承的情况就比较复杂了。由继承了基类,还将往上回溯,递归地调用基类的无参构造方法。
在我们的例子中,在初始化静态数据后,会先往上追溯,调用父的默认构造方法,此时再往上追溯到爷爷的默认构造方法。
二、信息技术的不断发展
java也体现了现代社会下信息技术的不断发展,科技水平的不断进步,人们的工作也越来越便利,日常生活也越来越方便,越来越多的工具被人们所开发应用 。科技的发展也要求我们掌握更多的知识,在探索的过程中,我们需要明白更方便的方法使用更便捷的方法来取得成就,我的方法会让过程事半功倍。科技的发展也要求我们掌握越来越多的知识,我们可以通过学习来获得更多的知识,来帮助我们在以后的工作生活,多些技能总是有好处的 。
无论是java还是什么别的东西他都体现了现代社会与信息技术的不断发展,人们在进行进行技术开发时也有了越来越多的方法。程序类的工作也有了更为快捷的方法,这为信息技术的发展也提供了更好的发展方法
JAVA中线程同步方法有哪些
JAVA中线程同步方法一般有以下三种:
1 wait方法:
该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行)。
调用wait方法需要注意几点:
第一点:wait被调用的时候必须在拥有锁(即synchronized修饰的)的代码块中。
第二点:恢复执行后,从wait的下一条语句开始执行,因而wait方法总是应当在while循环中调用,以免出现恢复执行后继续执行的条件不满足却继续执行的情况。
第三点:若wait方法参数中带时间,则除了notify和notifyAll被调用能激活处于wait状态(等待状态)的线程进入锁竞争外,在其他线程中interrupt它或者参数时间到了之后,该线程也将被激活到竞争状态。
第四点:wait方法被调用的线程必须获得之前执行到wait时释放掉的锁重新获得才能够恢复执行。
2 notify方法和notifyAll方法:
notify方法通知调用了wait方法,但是尚未激活的一个线程进入线程调度队列(即进入锁竞争),注意不是立即执行。并且具体是哪一个线程不能保证。另外一点就是被唤醒的这个线程一定是在等待wait所释放的锁。
notifyAll方法则唤醒所有调用了wait方法,尚未激活的进程进入竞争队列。
3 synchronized关键字:
第一点:synchronized用来标识一个普通方法时,表示一个线程要执行该方法,必须取得该方法所在的对象的锁。
第二点:synchronized用来标识一个静态方法时,表示一个线程要执行该方法,必须获得该方法所在的类的类锁。
第三点:synchronized修饰一个代码块。类似这样:synchronized(obj) { //code.... }。表示一个线程要执行该代码块,必须获得obj的锁。这样做的目的是减小锁的粒度,保证当不同块所需的锁不冲突时不用对整个对象加锁。利用零长度的byte数组对象做obj非常经济。
java如何实现线程同步的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、java如何实现线程同步的信息别忘了在本站进行查找喔。
发布于:2022-11-22,除非注明,否则均为
原创文章,转载请注明出处。