java多线程 同步方法也会被抢, 就是只有同步方法在其他线程要访问同一个实例的同步方法时。。。。

ackage cn.twj.rtti.t;//: concurrency/AtomicityTest.java

import java.util.concurrent.*;

public class AtomicityTest implements Runnable {    private int i = 0;

    public int getValue() {        return i;    }

    //设置此方法为同步方法的意思并不是说进入此方法后其他线程就会等待此方法完成了    //在非进入此方法的线程中,还是会和当前线程抢占    //有可能在执行到第一句的时候就被其他线程抢过去了。但是由于同步块确保了变量的可视性,导致在执行完第一句(也是非原子性操作的,或者还没执行完第一句就被其他线程抢走了,并没有自增完成),    // i的值就向主内存中刷新了而其他线程获取i变量时就还是0    //而在其他线程执行的时间内中,此方法挂起    //还有有可能在执行完第一条语句后被抢走执行权,所以那时候i的值为奇数    //所以Main方法返回为会奇数,然后退出线程

//结果1:就是只有同步方法在其他线程要访问同一个实例的同步方法时,才会进行挂起直接执行的操作,而对于非同步方法 如getValue ,其他线程是可以在某个线程执行同一个实例的同步方法时进入//非同步方法的,因为该方法没有锁(this)//结果2:同步方法也会被抢,只是在共享同一方法时 其操作类似于原子性,其他线程必须等待拿到锁的线程释放锁之后才能执行    private synchronized void evenIncrement() {        i++;        i++;    }

    public void run() {        while (true)            evenIncrement();    }

    public static void main(String[] args) {        ExecutorService exec = Executors.newCachedThreadPool();        AtomicityTest at = new AtomicityTest();        exec.execute(at);        while (true) {            int val = at.getValue();            if (val % 2 != 0) {                System.out.println(val);                System.exit(0);            }        }    }}
时间: 2024-08-05 07:09:18

java多线程 同步方法也会被抢, 就是只有同步方法在其他线程要访问同一个实例的同步方法时。。。。的相关文章

java——多线程——单例模式的static方法和非static方法是否是线程安全的?

单例模式的static方法和非static方法是否是线程安全的? 答案是:单例模式的static方法和非static方法是否是线程安全的,与单例模式无关.也就说,如果static方法或者非static方法不是线程安全的,那么不会因为这个类使用了单例模式,而变的安全. 闲话休说,看代码: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestSingl

Java多线程与并发应用-(9)-锁lock+条件阻塞conditon实现线程同步通信

一. lock可以代替synchronized关键字实现互斥功能.使用方法如下: Lock l = ...; l.lock(); try { // access the resource protected by this lock } finally { l.unlock(); } 需要注意的是. 1.需要互斥的一个或多个方法要使用同一个互斥锁. 2.在被锁包含的代码块中,要使用finally块将锁释放. 二. Condition的await方法(注意不是wait方法)可以替换传统通信中的wa

Java多线程和并发(六),yield函数和中断线程

目录 1.yield函数 2.中断线程 六.yield函数和中断线程 1.yield函数 2.中断线程 (1)已经被抛弃的方法 (2)目前使用的方法 原文地址:https://www.cnblogs.com/xzmxddx/p/10362835.html

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语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码.当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块.然而,当一个线程访问object的一个加锁代码块时,另一个线程仍然可以访问该object中的非加锁代码块. ——以上来源百度百科 一.方法内的变量为线程安全 “非线程安全”的问题

java多线程系列(二)

对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理解能让知识更加简单易懂. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知机制 java多线程系列(四)之ReentrantLock的使用 线程安全 线程安全就是多线程访问时,采用了加锁机制,当一个

Java多线程编程核心技术(三)多线程通信

线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控与监督.在本章中需要着重掌握的技术点如下: 使用wait/notify实现线程间的通信 生产者/消费者模式的实现 方法join的使用 ThreadLocal类的使用 1.等待 / 通知机制 通过本节可以学习到,线程与线程之间不是独立的个体,它们彼此

Rhythmk 一步一步学 JAVA (21) JAVA 多线程

1.JAVA多线程简单示例 1.1 .Thread  集成接口 Runnable 1.2 .线程状态,可以通过  Thread.getState()获取线程状态: New (新创建) Runnable (可以运行) Blocked  (被阻塞) Waiting  (等待) Timed waiting (计时等待) Terminated  (被终止) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

synchronized与static synchronized 的区别、synchronized在JVM底层的实现原理及Java多线程锁理解

本Blog分为如下部分: 第一部分:synchronized与static synchronized 的区别 第二部分:JVM底层又是如何实现synchronized的 第三部分:Java多线程锁,源代码剖析 第一部分:synchronized与static synchronized的区别 1.synchronized与static synchronized 的区别 synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是"类