java 多线程(synchronized)

package com.example;

public class App {

    public static void main(String[] args) {
        doRunable dr = new doRunable();
        Thread t1 = new Thread(dr,"Thread1");
        Thread t2 = new Thread(dr,"Thread2");

        t1.start();
        t2.start();
    }
}
package com.example;

public class doRunable implements Runnable {

    private Foo foo = new Foo();

    @Override
    public void run() {
        for (int i = 0; i < 4; i++) {
            this.foo.modify(10);

            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(Thread.currentThread().getName()
                    +"__"+ this.foo.getNum());
        }
    }

    public int getNum(){
        return this.foo.getNum();
    }
}
package com.example;

public class Foo {

    private int num = 100;

    public int getNum() {
        return this.num;
    }

    public int modify(int n) {
        /*Java语言中,每个对象都拥有一个访问代码关键部分并防止其他对象访问这段代码的monitor
            (每个对象都拥有一个对代码关键部分提供访问互斥功能的monitor)。这段关键部分是使用
         synchronized对方法或者代码标注实现的。同一时间在同一个monitor中,只允许一个线程
            运行代码的任意关键部分。*/
        synchronized (this) {
            System.out.println("in" + this.num + " " + n);
            int m = this.num;
            this.num = m - n;
            System.out.println("out" + this.num + " " + n);
        }

        return this.num;
    }
}
时间: 2024-10-11 06:19:20

java 多线程(synchronized)的相关文章

Java多线程synchronized同步

非线程安全问题 “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程问题”.也即是说,方法中的变量永远是线程安全的. 如果多个线程共同访问1个对象中的实例变量,则可能线程不安全.下面以实例说明 1 public class HasSelfNum { 2 private int num = 0; 3 public void add(String name) { 4 try { 5 if (name.equals("a")) { 6 num = 100; 7

JAVA多线程synchronized详解

Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块. 尤其关键

java 多线程 Synchronized方法和方法块 synchronized(this)和synchronized(object)的理解

synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法.如:public synchronized void accessVal(int newVal);synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否

java 多线程 synchronized块 同步方法

synchronized关键字又称同步锁 当方法执行完后,会自动释放锁,只有一个线程能进入此方法 看看以下的各种例子对synchronized的详细解释 1.是否加synchronized关键字的不同 1 public class ThreadTest { 2 3 public static void main(String[] args) { 4 Example example = new Example(); 5 6 Thread t1 = new Thread1(example); 7 T

Java多线程synchronized关键字

synchronized关键字代表着同步的意思,在Java中被synchronized修饰的有三种情况 1.同步代码块 //锁为objsynchronized(obj){ while(true){ if(product > 0){ System.out.println(Thread.currentThread().getName()+"消费:"+product--); } } } 2.同步函数 //锁为thispublic synchronized void consume()

java多线程synchronized volatile解析

先简单说说原子性:具有原子性的操作被称为原子操作.原子操作在操作完毕之前不会线程调度器中断.即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行.在Java中,对除了long和double之外的基本类型的简单操作都具有原子性.简单操作就是赋值或者return.比如”a = 1;“和 “return a;”这样的操作都具有原子性.但是在Java中,类似”a += b”这样的操作不具有原子性,不是同步的就会出现难以预料的结果. 在我们平常的编程过程中,经常会遇到线程安

java多线程synchronized底层实现

一直想把这个特别重要的关键词的底层实现搞明白.(当然现在也没有完全明白,如果有错误以后修改这篇文章) 首先,这个关键词synchronize可以说是个语法糖,它的具体用法网上很多博客都讲的比较明了了. 简而言之就是对一个对象“加锁”.首先,找个地方的对象不一定是堆里面的类的实例对象,也有可能是方法区的类对象.其次,这个关键词修饰的代码块的加锁过程有两个,进入的时候尝试获得锁(java字节码 monitorenter),退出时释放锁(java字节码monitorexit).这两个操作的再下一层是基

Java多线程-synchronized(非this对象)

3个结论 synchronized(非this对象 x) 是将 x 对象本身作为“对象监视器”,因此有如下三个结论: 1)当多个线程同时执行 synchronized(x){}同步代码块时呈同步效果 2)当其他线程执行 x 对象中 synchronized 同步方法时呈同步效果 3)当其他线程执行 x 对象方法里的 synchronized(this) 代码块时也呈现同步效果. 静态同步方法 与 synchronized(class)代码块 关键字 synchronized 还可以应用在 sta

java 多线程——quartz 定时调度的例子

java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 java 多线程—— 线程等待与唤醒 概述 第1部分 配置 第2部分 代码示例 第1部分 配置 有关quartz的api文档地址:Quartz Enterprise Job Scheduler 1.8.6 API 主要接口目录: 重点看下Job,Scheduler,Trigger,JobDetai

java 多线程—— 线程让步

java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 java 多线程—— 线程等待与唤醒 java 多线程—— 线程让步 概述 第1 部分 yield()介绍 第2 部分 yield()示例 第3 部分 yield() 与 wait()的比较 第1 部分 yield()介绍 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”