synchronized 是java 内主要的同步标记

1 同步非静态方法

  作用域范围只是当前对象在不同线程间的同步, 如果n 为Test外的对象,在不同的Test对象之间,等于没有同步, 该方法只能同步n为Test类内对象

public class Test
public synchronized void inc() {
n++;
}
}

  如果想同步类外的n,使用同步代码块对象,对象也为一个类外对象,相对所有Test对象来说, 也只有一个,所以就能同步

final Integer lock = new Integer(1);
class Test implements Runnable {
public int value = 0;
public void inc() {
synchronized (lock)
{
m++;
value++;
n++;
}
}

  

2  同步静态方法

public class Test
public static synchronized void inc() {
n++;
}
}

  作用域范围是所有Test类对象,  inc方法在所有Test对象之间只能被一个同时调用

3  同步代码块

publci class Test{
public void inc() {
synchronized (lock)
{
// m++;
value++;
n++;
}
}
}

  

  作用域范围,取决于lock的相对该类的作用域范围

如果lock 是该类以外的对象,相对所有的Test 对象而言,  lock是个全局变量,  synchronized同步范围在所有对象之间

如果lock 是该类以内的对象,如类内变量,相对所有的Test 对象而言,  lock是个本地局部变量,  synchronized同步范围在同一对象的不同线程之间, 和同步非静态方法一样

测试代码

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CountDownLatch; public class TestVolatile {
public static volatile int n = 0; //
public Integer m = 0;
final Integer lock = new Integer(1); class MyThread implements Runnable {
public int value = 0;
public void inc() {
synchronized (lock)
{
m++;
value++;
n++;
}
} public void run() { {
for (int i = 0; i < 1000; i++)
try {
// System.out.println(i);
inc();
// m++;
// vboolean = vboolean == true ? false : true;
Thread.sleep(3); // 为了使运行结果更随机,延迟3毫秒
} catch (Exception e) {
}
}
}
} static class MyThread1 implements Runnable {
public static Integer locallock = new Integer(2);
public static synchronized void inc() {
n++;
} public void run() {
for (int i = 0; i < 1000; i++)
try {
//inc(); 方法一 // 方法二
synchronized (locallock){
n = n + 1;
}
Thread.sleep(3);
} catch (Exception e) {
}
}
} class MyThread2 implements Runnable {
public void run() {
synchronized (lock) {
for (int i = 0; i < 100; i++)
try {
m++;
Thread.sleep(3); // 为了使运行结果更随机,延迟3毫秒
} catch (Exception e) {
}
}
}
} // 3和2代码一样,只是一个是分开锁, 一个只是单独加锁, 效率相差10倍左右。
class MyThread3 implements Runnable {
public void inc() {
synchronized (lock) {
m++;
}
} public void run() {
for (int i = 0; i < 1000; i++)
try {
inc();
Thread.sleep(3); // 为了使运行结果更随机,延迟3毫秒
} catch (Exception e) {
}
}
} public Value g_value = new Value();
public class Value{
public synchronized void inc()
{
m++;
}
} // 4和3功能差不多,只是 MyThread4, 使用全局变量g_value 的锁,不同线程间同步
class MyThread4 implements Runnable {
public int value = 0;
public void inc() {
{
g_value.inc();
}
} public void run() {
for (int i = 0; i < 1000; i++)
try {
inc();
Thread.sleep(3); // 为了使运行结果更随机,延迟3毫秒
} catch (Exception e) {
}
}
} public void runthread() throws InterruptedException {
long beg = System.currentTimeMillis();
MyThread1[] mythreadary = new MyThread1[100];
Thread[] threadary = new Thread[100];
for (int i = 0; i < threadary.length; i++) {
mythreadary[i] = new MyThread1();
threadary[i] = new Thread(mythreadary[i], "test1");
} for (int i = 0; i < threadary.length; i++) {
threadary[i].start();
} for (int i = 0; i < threadary.length; i++) {
threadary[i].join();
// System.out.println((mythreadary[i]).value);
} System.out.println(TestVolatile.n);
System.out.println(m); System.out.println("程序耗时: " + (System.currentTimeMillis() - beg));
} public static void main(String[] args) throws InterruptedException {
TestVolatile tmp = new TestVolatile();
tmp.runthread();
}
}

  

Java 多线程序的一点理解的更多相关文章

  1. Java多线程同步锁的理解

    java主要通过synchronized的关键字来实现的.让我们从一个买票程序说起吧. package com.day04; /** * * @author Administrator 问题描述:使用 ...

  2. 对java多线程的一些浅浅的理解

    作为一名JAVA初学者,前几天刚刚接触多线程这个东西,有了些微微的理解想写下来(不对的地方请多多包涵并指教哈). 多线程怎么写代码就不说了,一搜一大堆.说说多线程我认为最难搞的地方,就是来回释放锁以及 ...

  3. java 多线程详细笔记(原理理解到全部使用)

    鸽了好久以后终于又更新了,看同学去实习都是先学源码然后修改之类,才发觉只是知道语法怎么用还远远不够,必须要深入理解以后不管是学习还是工作,才能举一反三,快速掌握. 目录 基础知识 进程与线程 线程原子 ...

  4. 关于java多线程关键字volatile的理解

    volatile关键字的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值. 使用volition关键字增加了实例变量在多个线程间的可见性.但volition有个致命的缺点就是不 ...

  5. Java中try-catch-finally的一点理解

    在只有try-catch语句中,如果catch块中出现了return语句或者抛出了异常,那么catch之后的语句是执行不到的:但是如果将代码放入finally中,即使catch中出现了return语句 ...

  6. 1.1对java web开发的一点理解

    前言 Q:通常行内人士见面会问你,你做哪方面开发的? A:java web开发的 那么,什么是java web开发? java web开发通常是指java web应用程序的开发.一个B/S架构的 we ...

  7. 关于java中String的一点理解

      String类是java的最基本类之中的一个,非常好的掌握它的原理非常是必要的!   1.String的Final类型的.是不可继承 的.final类默认的方法都为final类型,保证了方法不能被 ...

  8. java多线程那点事

    屌丝程序员们对自己的技术能力总是毫不掩饰的高调,更有甚者每当完成一个简单的功能或算法实现,恨不得从工位上跳起来,生怕谁不知道一样,心情能理解,但个人完全鄙视这种行为.说到底,大家日常的coding,大 ...

  9. Java多线程学习笔记--生产消费者模式

    实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...

随机推荐

  1. P1488 肥猫的游戏

    题目描述 野猫与胖子,合起来简称肥猫,是一个班的同学,他们也都是数学高手,所以经常在一起讨论数学问题也就不足为奇了.一次,野猫遇到了一道有趣的几何游戏题目,便拿给胖子看.游戏要求在一个有n个顶点凸多边 ...

  2. Java Dictionary Example

    Dictionary class is the abstract class which is parent of any class which uses the key and value pai ...

  3. Typeahead的使用总结

    Typeahead是Bootstrap的自动补全JS插件. 最近项目中用到,总结一下. 与autocomplish类似,通过ajax实现,实现流程是前台输入关键字,后台根据关键字查询出信息,构造jso ...

  4. libevent学习八(evbuffer)

    1.evbuffer以队列的形式管理字节,从尾部添加,从头部取出(FIFO) 2.evbuffer内部存储形式是多个独立的连续内存       接口 //创建和删除 struct evbuffer * ...

  5. RSA加密通信小结(二)-新版本APP与后台通信交互内容修改方案

    注1:本次修改分为两步,首先是内容相关的修改,待其完成之后,再进行加密通信项(粗体字备注)修改. 1.新的提交后台的格式包括:data,token(预留字段,暂时后台不校验),userId(已有的不删 ...

  6. Navicat和DBeaver的查询快捷键

    1.Navicat for MySQL(连接MySQL数据库的工具) ctrl + r 执行查询页中所有的sql语句 ctrl + shift + r 只运行选中的sql语句 2.DBeaver(支持 ...

  7. python基本数据类型——集合

    集合 无序可变序列,集合中元素不允许重复,即每个元素都是唯一的 集合中的元素按照升序排列 # 创建集合 >>aset = set([0,2,4,5,7,2,3,5,9,0]) >&g ...

  8. crt0.S(_main)代码分析

    crt0,S(_main)代码分析 --- 1. 设置sp寄存器地址 //设置SP栈指针 #if defined(CONFIG_SPL_BUILD) && defined(CONFIG ...

  9. 2018java开发一些面经

    算法系列:https://www.cnblogs.com/yanmk/p/9232908.html 2018Java开发面经(持续更新) 不要给自己挖坑!!!不要给自己挖坑!!!不要给自己挖坑!!!如 ...

  10. (转载)IE8+兼容经验小结

    本文分享下我在项目中积累的IE8+兼容性问题的解决方法.根据我的实践经验,如果你在写HTML/CSS时候是按照W3C推荐的方式写的,然后下面的几点都关注过,那么基本上很大一部分IE8+兼容性问题都OK ...