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通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...
随机推荐
- 20145226夏艺华 JAVA预备作业1
博客阅读总结 关于师生关系: 学生和老师之间我觉得关系时多元化的,不能拘泥于单独的一种关系:灌输与被灌输,教授与被教授--我认为,在不同的课程阶段,师生之间的关系都可以发生变化.前期的老师更像是一个指 ...
- 天津Uber优步司机奖励政策(1月11日~1月17日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- cakephp中find('list')的使用
运用一.快速实现下拉菜单 控制器中,使用find('list')返回的是键值对的数组,键名是array的第一个参数id,键值就是第二个参数content. public function list_s ...
- 提权基础-----mysql-udf提权
1.总结关于udf提权方法 通过弱口令,爆破,网站配置文件等方式得到mysql数据库帐号密码,---还要能外连 (1).将udf.dll代码的16进制数声明给my_udf_a变量 set @my_ud ...
- Unity Shader学习笔记 - 用UV动画实现沙滩上的泡沫
这个泡沫效果来自远古时代的Unity官方海岛Demo, 原效果直接复制3个材质球在js脚本中做UV动画偏移,这里尝试在shader中做动画并且一个pass中完成: // Upgrade NOTE: r ...
- MVC数据的注册及验证简单总结
一.注解 注解是一种通用机制,可以用来向框架注入元数据,同时,框架不只驱动元数据的验证,还可以在生成显示和编辑模型的HTML标记时使用元数据. 二.验证注册的使用 1.Require:属性为Null或 ...
- C 计算员工工资
#include <stdio.h> int main(int argc, char **argv) { //定义四个变量 g每小时固定的工资 40 固定工作时间 pay工资 hours员 ...
- 【cover-view、cover-image】 覆盖组件说明
cover-view.cover-image 这两类覆盖组件用于显示在一些特殊组件上方(map.video.canvas.camera.live-player.live-pusher). 这类组件一般 ...
- ajax 个人理解 学习笔记
W:Ajax Q:异步网络请求.无刷新请求数据. W:ajax的实现流程如下: Q: 创建XHR对象 调用open()方法,创建请求 调用send()方法,发送请求 捕获请求状态,判断请求结果 获取数 ...
- JDK源码分析:Integer.java部分源码解析
1)声明部: public final class Integer extends Number implements Comparable<Integer> extends Number ...