导航:首页 > 编程语言 > java同步方法有哪些

java同步方法有哪些

发布时间:2022-04-12 09:46:59

‘壹’ java多线程同步的几种方式

java中多线程的实现方法有两种:1.直接继承thread类;2.实现runnable接口;同步的实现方法有五种:1.同步方法;2.同步代码块;3.使用特殊域变量(volatile)实现线程同步;4.使用重入锁实现线程同步;5.使用局部变量实现线程同步 。
其中多线程实现过程中需注意重写或者覆盖run()方法,而对于同步的实现方法中使用较常使用的是利用synchronized编写同步方法和代码块。
谢谢采纳!!

‘贰’ java 实现线程同步的方式有哪些

实现同步机制有两个方法:
1、同步代码块:
synchronized(同一个数据){} 同一个数据:就是N条线程同时访问一个数据。
2、同步方法:
public synchronized 数据返回类型 方法名(){}
就是使用 synchronized 来修饰某个方法,则该方法称为同步方法。对于同步方法而言,无需显示指定同步监视器,同步方法的同步监视器是 this 也就是该对象的本身(这里指的对象本身有点含糊,其实就是调用该同步方法的对象)通过使用同步方法,可非常方便的将某类变成线程安全的类,具有如下特征:
1,该类的对象可以被多个线程安全的访问。
2,每个线程调用该对象的任意方法之后,都将得到正确的结果。
3,每个线程调用该对象的任意方法之后,该对象状态依然保持合理状态。
注:synchronized关键字可以修饰方法,也可以修饰代码块,但不能修饰构造器,属性等。
实现同步机制注意以下几点: 安全性高,性能低,在多线程用。性能高,安全性低,在单线程用。
1,不要对线程安全类的所有方法都进行同步,只对那些会改变共享资源方法的进行同步。
2,如果可变类有两种运行环境,当线程环境和多线程环境则应该为该可变类提供两种版本:线程安全版本和线程不安全版本(没有同步方法和同步块)。在单线程中环境中,使用线程不安全版本以保证性能,在多线程中使用线程安全版本.

‘叁’ Java实现线程同步的几种方式

java中多线程的实现方法有两种:1.直接继承thread类;2.实现runnable接口;同步的实现方法有五种:1.同步方法;2.同步代码块;3.使用特殊域变量(volatile)实现线程同步;4.使用重入锁实现线程同步;5.使用局部变量实现线程同步 。
其中多线程实现过程中需注意重写或者覆盖run()方法,而对于同步的实现方法中使用较常使用的是利用synchronized编写同步方法和代码块。

‘肆’ java中线程同步的几种方法

线程同步主要有以下种方法(示例中是实现计数的功能):

1、同步方法,即使用synchronized关键字修饰方法,例如:

publicsynchronizedvoidadd(intc){...}

2、同步代码块,即有synchronized关键字修饰的语句块,例如:

publicvoidaddAndGet(intc){
synchronized(this){
count+=c;
}
}

3、使用特殊域变量(volatile)实现线程同步,该方法不能保证绝对的同步。

例如:privatevolatileintcount=0;

4、使用锁实现线程同步,例如:

privateLocklock=newReentrantLock();
publicvoidadd(intc){
lock.lock();//上锁
try{
count+=c;
}finally{
lock.unlock();//解锁
}
}

5、使用原子变量实现线程同步,在java的util.concurrent.atomic包中提供了创建了原子类型变量的工具类,例如:

privateAtomicIntegercount=newAtomicInteger(1);
publicvoidadd(intc){
count.addAndGet(c);
}

6、使用局部变量实现线程同步,如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本, 副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。

ThreadLocal 类的常用方法

new ThreadLocal<T>() : 创建一个线程本地变量

get() : 返回此线程局部变量的当前线程副本中的值

initialValue() : 返回此线程局部变量的当前线程的"初始值"

set(T value) : 将此线程局部变量的当前线程副本中的值设置为value

示例代码:

privatestaticThreadLocal<Integer>count=newThreadLocal<Integer>(){
@Override
protectedIntegerinitialValue(){
return1;
}
};

publicvoidadd(intc){
count.set(count.get()+c);
}

7、使用阻塞队列实现,例如LinkedBlockingQueue,具体使用可网络LinkedBlockingQueue的用法或查看java文档。

‘伍’ Java线程同步的方法

等待唤醒机制
wait():让线程等待。将线程存储到一个线程池中。
notify():唤醒被等待的线程。通常都唤醒线程池中的第一个。让被唤醒的线程处于临时阻塞状态。
notifyAll(): 唤醒所有的等待线程。将线程池中的所有线程都唤醒,让它们从冻结状体转到临时阻塞状态.
这三个方法用于操作线程,可是定义在了Object类中,为什么呢?
因为,这三个方法在使用时,都需要定义在同步中,要明确这些方法所操作的线程所属于锁。
简单说。在A锁被wait的线程,只能被A锁的notify方法唤醒。
所以必须要表示wait notify方法所属的锁对象,而锁对象可以是任意的对象。
可以被任意的对象调用的方法肯定定义在Object类中。
注意:等待唤醒机制,通常都用在同步中,因为需要锁的支持。
而且必须要明确wait notify 所作用的锁对象。

JDK1.5后的锁

在jdk1.5版本之后,
出现了一些新的特性,将原理的线程进行了改良。
在java.util.concurrent.locks包中提供了一个接口Lock。替代了synchronized。
synchronized。使用的是锁操作是隐式的。
Lock接口,使用的锁操作是显示的。
由两个方法来完成:
lock():获取锁。
unlock():释放锁。
还有一个对象,Condition.
该对象的出现替代了Object中的wait notify notifyAll这些操作监视器的方法。
替代后的方式:await signal signalAll.

‘陆’ java中同步有几种方式啊

1。同步代码块:
synchronized(同一个数据){} 同一个数据:就是N条线程同时访问一个数据。
2。
同步方法:
public synchronized 数据返回类型 方法名(){}

是使用 synchronized 来修饰某个方法,则该方法称为同步方法。对于同步方法而言,无需显示指定同步监视器,同步方法的同步监视器是
this
也就是该对象的本身(这里指的对象本身有点含糊,其实就是调用该同步方法的对象)通过使用同步方法,可非常方便的将某类变成线程安全的类,具有如下特征:
1,该类的对象可以被多个线程安全的访问。
2,每个线程调用该对象的任意方法之后,都将得到正确的结果。
3,每个线程调用该对象的任意方法之后,该对象状态依然保持合理状态。
注:synchronized关键字可以修饰方法,也可以修饰代码块,但不能修饰构造器,属性等。
实现同步机制注意以下几点: 安全性高,性能低,在多线程用。性能高,安全性低,在单线程用。
1,不要对线程安全类的所有方法都进行同步,只对那些会改变共享资源方法的进行同步。
2,如果可变类有两种运行环境,当线程环境和多线程环境则应该为该可变类提供两种版本:线程安全版本和线程不安全版本(没有同步方法和同步块)。在单线程中环境中,使用线程不安全版本以保证性能,在多线程中使用线程安全版本.

线程通讯:
为什么要使用线程通讯?

使用synchronized
来修饰某个共享资源时(分同步代码块和同步方法两种情况),当某个线程获得共享资源的锁后就可以执行相应的代码段,直到该线程运行完该代码段后才释放对该

共享资源的锁,让其他线程有机会执行对该共享资源的修改。当某个线程占有某个共享资源的锁时,如果另外一个线程也想获得这把锁运行就需要使用wait()
和notify()/notifyAll()方法来进行线程通讯了。
Java.lang.object 里的三个方法wait() notify() notifyAll()
wait方法导致当前线程等待,直到其他线程调用同步监视器的notify方法或notifyAll方法来唤醒该线程。
wait(mills)方法
都是等待指定时间后自动苏醒,调用wait方法的当前线程会释放该同步监视器的锁定,可以不用notify或notifyAll方法把它唤醒。
notify()
唤醒在同步监视器上等待的单个线程,如果所有线程都在同步监视器上等待,则会选择唤醒其中一个线程,选择是任意性的,只有当前线程放弃对该同步监视器的锁定后,也就是使用wait方法后,才可以执行被唤醒的线程。
notifyAll()方法
唤醒在同步监视器上等待的所有的线程。只用当前线程放弃对该同步监视器的锁定后,才可以执行被唤醒的线程

‘柒’ 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的同步可以用synchronized关键字来实现。

sychronized可以同步代码,需要绑定一个对象,如synchronized(obj){}
也可以同步一个方法,是对方法进行线程同步。如public void synchronized methodA(){}

‘拾’ java中实现同步的两种方式syschronized和lock的区别和联系

Lock是java.util.concurrent.locks包下的接口,Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我们拿Java线程(二)中的一个例子简单的实现一下和sychronized一样的效果,代码如下:

[java]view plain

  • Thread-4准备读取数据

  • Thread-3准备读取数据

  • Thread-5准备读取数据

  • Thread-5读取18

  • Thread-4读取18

  • Thread-3读取18

  • Thread-2准备写入数据

  • Thread-2写入6

  • Thread-2准备写入数据

  • Thread-2写入10

  • Thread-1准备写入数据

  • Thread-1写入22

  • Thread-5准备读取数据

  • 从结果可以看出实现了我们的需求,这只是锁的基本用法,锁的机制还需要继续深入学习。

    本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/7461369,转载请注明。

    在java中有两种方式实现原子性操作(即同步操作):
    1)使用同步关键字synchronized
    2)使用lock锁机制其中也包括相应的读写锁


    package com.xiaohao.test;

    import java.util.Random;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;

    public class Test {
    public static void main(String[] args) {
    final LockTest lock=new LockTest();
    //输出张三
    new Thread(){
    public void run(){
    lock.test("张三张三张三张三张三张三张三张三张三张三");
    }
    }.start();

    //输出李四
    new Thread(){
    public void run(){
    lock.test("李四李四李四李四李四李四李四李四李四李四");System.out.println
    (" ---------------------------------------------------------------");
    }
    }.start();


    //---------------------------------------------------------------
    //模拟写入数据的
    for (int i = 0; i < 3; i++) {
    new Thread(){
    public void run() {
    for (int j = 0; j < 5; j++) {
    // lock.set(new Random().nextInt(30));
    lock.set2(new Random().nextInt(30));

    }
    }
    }.start();

    }
    //模拟读取数据的
    for (int i = 0; i < 3; i++) {
    new Thread(){
    public void run() {
    for (int j = 0; j < 5; j++) {
    // lock.get();
    lock.get2();
    }
    }
    }.start();
    }


    }
    }

    class LockTest{
    private Lock lock=new ReentrantLock(); //创建普通的锁
    private ReadWriteLock readWriteLock=new ReentrantReadWriteLock();//创建读写锁
    private int data;// 共享数据


    //实现同步的方法一 使用同步关键字 synchronized
    public synchronized void test(String name){
    //下面的相关操作是一个原子性的操作
    // lock.lock();// 得到锁
    try {
    for(int i = 0; i < name.length(); i++) {
    System.out.print(name.charAt(i));
    }
    } finally {
    // lock.unlock();// 释放锁
    }
    }
    //实现同步的方法二 使用lock锁机制
    public void test2(String name){
    //下面的相关操作是一个原子性的操作
    lock.lock();// 得到锁
    try {
    for(int i = 0; i < name.length(); i++) {
    System.out.print(name.charAt(i));
    }
    } finally {
    lock.unlock();// 释放锁
    }
    }


    //使用set方法模拟写入数据
    //使用 synchronized 实现了读读,写写,读写之间的互斥 ,但读读之间的互斥是没有什么必要的
    public synchronized void set(int data){
    System.out.println(Thread.currentThread().getName() + "准备写入数据");
    try {
    Thread.sleep(20);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    this.data = data;
    System.out.println(Thread.currentThread().getName() + "写入" + this.data);
    }

    //使用get方法模拟读取数据
    //使用 synchronized 实现了读读,写写,读写之间的互斥 ,但读读之间的互斥是没有什么必要的
    public synchronized void get() {
    System.out.println(Thread.currentThread().getName() + "准备读取数据");
    try {
    Thread.sleep(20);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName() + "读取" + this.data);
    }


    //使用set方法模拟写入数据
    //使用 读写锁实现了写写,读写之间的互斥 ,但读读之间的互斥是没有什么必要的
    public void set2(int data){
    readWriteLock.writeLock().lock();//获取写入锁
    try{
    System.out.println(Thread.currentThread().getName() + "准备写入数据");
    try {
    Thread.sleep(20);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    this.data = data;
    System.out.println(Thread.currentThread().getName() + "写入" + this.data);
    }
    finally{
    readWriteLock.writeLock().unlock();
    }
    }


    //使用get方法模拟读取数据
    //使用 读写锁实现了写写,读写之间的互斥 ,但读读之间的互斥是没有什么必要的
    public void get2() {
    //获取相应的读锁
    readWriteLock.readLock().lock();
    try{
    System.out.println(Thread.currentThread().getName() + "准备读取数据");
    try {
    Thread.sleep(20);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName() + "读取" + this.data);
    }
    finally{
    // 释放相应的写锁
    readWriteLock.readLock().unlock();
    }
    }

    }

    线程同步经典版:

    package com.xiaohao.test;

    import java.util.concurrent.locks.ReentrantReadWriteLock;

    public class Test2{

    public static void main(String[] args){

    final LockTest2 lockTest=new LockTest2();

    for(int i=0;i<3;i++) {

    new Thread(){

    public void run(){

    try {

    for (int j = 0; j < 3; j++) {

    lockTest.setValue();

    } } catch (InterruptedException e) {

    // TODO Auto-generated catch block e.printStackTrace();

    }

    }

    }.start();

    }

    for(int i=0;i<3;i++) {

    new Thread(){

    public void run(){

    try {

    for (int j = 0; j < 3; j++) {

    lockTest.getValue();

    }

    } catch (InterruptedException e)

    { // TODO Auto-generated catch block e.printStackTrace(); }

    }

    }.start();

    }

    }

    }

    class LockTest2 {

    int data=0;

    ReentrantReadWriteLock lock= new ReentrantReadWriteLock();// 锁对象

    public void setValue() throws InterruptedException{

    lock.writeLock().lock();

    System.out.println("正在使用写锁......");

    data=(int) (Math.random()*10);

    System.out.println("正在写入:"+data);

    Thread.sleep(500);

    System.out.println("写锁调用完毕---------------------------");

    lock.writeLock().unlock(); }

    public void getValue() throws InterruptedException{

    lock.readLock().lock();

    System.out.println("正在使用读锁...........................................");

    System.out.println("正在读入:"+data); Thread.sleep(500);

    System.out.println("读锁调用完毕......");

    lock.readLock().unlock();

    }

    }

    **** 当一个线程进入了一个对象是的synchronized方法,那么其它线程还能掉否调用此对象的其它方法?

    这个问题需要分几种情况进行讨论。

    1)查看其它方法是否使用了同步关键字(synchronized)修饰,如果没有的话就可以调用相关的方法。

    2)在当前synchronized方法中是否调用了wait方法,如果调用了,则对应的锁已经释放,可以访问了。

    3)如果其它方法也使用synchronized修饰,并且当前同步方法中没有调用wait方法的话,这样是不允许访问的。

    4)如果其它方法是静态方法的话,由于静态方法和对象是扯不上什么关系,对于静态同步方法而言,其对应的同步监视器为当前类的字节码

    所以肯定可以访问的了。

    阅读全文

    与java同步方法有哪些相关的资料

    热点内容
    优信二手车解压后过户 浏览:61
    Windows常用c编译器 浏览:778
    关于改善国家网络安全的行政命令 浏览:833
    安卓如何下载网易荒野pc服 浏览:654
    javainetaddress 浏览:104
    苹果4s固件下载完了怎么解压 浏览:1002
    命令zpa 浏览:285
    python编译器小程序 浏览:944
    在app上看视频怎么光线调暗 浏览:540
    可以中文解压的解压软件 浏览:592
    安卓卸载组件应用怎么安装 浏览:912
    使用面向对象编程的方式 浏览:339
    程序员项目经理的年终总结范文 浏览:929
    内衣的加密设计用来干嘛的 浏览:432
    淮安数据加密 浏览:292
    魔高一丈指标源码 浏览:982
    松下php研究所 浏览:168
    c回调java 浏览:399
    梦幻端游长安地图互通源码 浏览:745
    电脑本地文件如何上传服务器 浏览:313