Java 多线程序的一点理解
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 多线程序的一点理解的更多相关文章
- Java多线程同步锁的理解
java主要通过synchronized的关键字来实现的.让我们从一个买票程序说起吧. package com.day04; /** * * @author Administrator 问题描述:使用 ...
- 对java多线程的一些浅浅的理解
作为一名JAVA初学者,前几天刚刚接触多线程这个东西,有了些微微的理解想写下来(不对的地方请多多包涵并指教哈). 多线程怎么写代码就不说了,一搜一大堆.说说多线程我认为最难搞的地方,就是来回释放锁以及 ...
- java 多线程详细笔记(原理理解到全部使用)
鸽了好久以后终于又更新了,看同学去实习都是先学源码然后修改之类,才发觉只是知道语法怎么用还远远不够,必须要深入理解以后不管是学习还是工作,才能举一反三,快速掌握. 目录 基础知识 进程与线程 线程原子 ...
- 关于java多线程关键字volatile的理解
volatile关键字的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值. 使用volition关键字增加了实例变量在多个线程间的可见性.但volition有个致命的缺点就是不 ...
- Java中try-catch-finally的一点理解
在只有try-catch语句中,如果catch块中出现了return语句或者抛出了异常,那么catch之后的语句是执行不到的:但是如果将代码放入finally中,即使catch中出现了return语句 ...
- 1.1对java web开发的一点理解
前言 Q:通常行内人士见面会问你,你做哪方面开发的? A:java web开发的 那么,什么是java web开发? java web开发通常是指java web应用程序的开发.一个B/S架构的 we ...
- 关于java中String的一点理解
String类是java的最基本类之中的一个,非常好的掌握它的原理非常是必要的! 1.String的Final类型的.是不可继承 的.final类默认的方法都为final类型,保证了方法不能被 ...
- java多线程那点事
屌丝程序员们对自己的技术能力总是毫不掩饰的高调,更有甚者每当完成一个简单的功能或算法实现,恨不得从工位上跳起来,生怕谁不知道一样,心情能理解,但个人完全鄙视这种行为.说到底,大家日常的coding,大 ...
- Java多线程学习笔记--生产消费者模式
实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...
随机推荐
- 笔记-django-视图
笔记-django-视图 1. dispatch 1.1. overview To design URLs for an app, you create a Python module ...
- msys2-x86_64搭建QT Mingw64编译环境
1.安装msys2-x86_64 2.环境变量 PATH 添加 C:\msys64\home\%name%3. 打开MSYS2 Shell,更新包数据库和核心系统包 pacman -Syu4. 关闭M ...
- Windows下的SysWow64和System32
64位的Windows并不是简单地把所有东西都编译成64位就万事大吉的.关于64位的CPU应该做成什么样子,Intel和AMD曾有各自的打算.AMD的回答直接了当:新的64位处理器,应该能在提高更高处 ...
- 青岛Uber优步司机奖励政策(1月4日~1月10日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 本地生成Rails API文档
#新建一rails项目 rails new dummy cd dummy # 生成文档 rake doc:rails 剩下的就是等待了. 生成的文档在dummp/doc/api .浏览器打开index ...
- MySQL高级-索引优化
索引失效 1. 2.最佳左前缀法则 4. 8. 使用覆盖索引解决这个问题. 二.索引优化 1.ORDER BY 子句,尽量使用Index方式排序,避免使用FileSort方式排序 MySQL支持两种方 ...
- SpringBoot学习:整合MyBatis,使用Druid连接池
项目下载地址:http://download.csdn.NET/detail/aqsunkai/9805821 (一)添加pom依赖: <!-- https://mvnrepository.co ...
- 在生产环境中部署asp.net core应用
设备:阿里云ECS云主机 操作系统:centos 7 操作步骤: 1 安装.net core sdk: # 添加dotnet product feed sudo rpm --import https: ...
- OSG-交互
本文转至http://www.cnblogs.com/shapherd/archive/2010/08/10/osg.html 作者写的比较好,再次收藏,希望更多的人可以看到这个文章 互联网是是一个相 ...
- python 终极篇 ---django 认证
Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...