- 【java】怎么理解不同对象实例的对象锁是互不干扰的
晨春计
Androidjava
在Java中,synchronized关键字用于实现线程同步,它可以作用于实例方法、静态方法以及代码块。当synchronized应用于实例方法或实例变量时,它创建的是一个对象锁,这个锁是与特定的对象实例关联的。因此,每个对象实例都有其自己的锁。这里的关键点在于,对象锁是绑定到特定对象实例上的。这意味着对于不同的对象实例,即使它们属于同一个类,它们各自拥有独立的对象锁。当一个线程获取了一个对象实例
- Rides实现分布式锁,保障数据一致性,Redisson分布式事务处理
朱杰jjj
缓存分布式
分布式环境下分布式锁有三种方式:基于数据库分布式锁基于Redis分布式锁基于zk分布式锁本帖只介绍Redis分布式锁为什么需要用到分布式锁?在单机环境下一个服务中多个线程对同一个事物或数据资源进行操作时,可以通过添加加锁方式(synchronized和lock)来解决数据一致性的问题。但是如果出现多个服务的情况下,这时候我们在通过synchronized和lock的方式来加锁会出现问题,因为多个服
- synchronized锁升级过程
liang8999
javajvm开发语言
一、synchronized锁加到什么地方synchronized上锁,其实锁信息是加在对象头中的markdown,对象中的前四个字节表示markdown;markdown还记录了对象的gc、hashcode信息注意:markdown结构与jvm虚拟机的实现有关,I)32位Hotspot虚拟机markdown结构如下:II)64位Hotspot虚拟机的markdown结构如下:二、synchron
- Java 入门基础篇05 - Java的关键字
仔仔 v1.0
Java基础java开发语言intellij-idea
什么是关键字?就是被java语言赋予特殊含义的单词。关键字的特点组成关键的字母都是小写。常见关键字class,public,static,void.....。关键字注意事项goto和const是java语言的保留字,关键字在IDEA编译器中有明确的颜色变化。关键字列表ABSTRACTCONTINUEFORNEWSWITCHassertdefaultgotopackagesynchronizedbo
- Java基础 -- 05反射reflect
mmlz00
Java基础Java基础反射reflectProxy动态代理
目录引序说不通1:注解说不通2:匿名内部类说不通3:动态代理反射:反射定义强调:类对象又强调:static类静态成员再三强调:synchronized修饰符类对象:知晓类结构类结构之:内部成员内部成员--构造函数内部成员--数据成员内部成员--方法成员静态代理:动态代理:反射+注解反射+泛型+注解getGenericSuperclass()用法引序引序:开始反射概念学习之前,先来段引序。请牢记:计
- 锁之synchronized 与volatile lock的异同
追梦的鱼儿
java锁synchronizedvolatileLock
目录synchronized特性用法使用场景synchronized的优缺点优点缺点volatile特性用法使用场景Lock特性用法使用场景总结相同点不同点synchronized关键字是Java提供的用于解决并发编程中数据一致性问题的重要工具。它通过锁机制确保在同一时刻只有一个线程能够执行被同步的方法或代码块,从而实现互斥访问。尽管synchronized使用简单且可靠,但在高并发场景下可能会带
- synchronized锁状态和底层实现
码了三年又三年
java开发语言
锁的状态无锁状态,偏向锁状态,轻量级锁状态,重量级锁状态。锁的状态是通过对象监视器在对象头中的字段来表明的,四种状态会随着竞争的情况逐渐升级。偏向锁、轻量级锁、重量级锁是针对synchronized的状态。这四种状态都不是Java语言中的锁,而是JVM为了提高锁的获取与释放效率而做的优化(使用synchronized时)无锁:没有任何线程使用锁对象。偏向锁:当前只有一个线程访问,在对象头MarkW
- JavaEE初阶-多线程2
炙热的大叔
JavaEE初阶java-eejavajvm
文章目录一、多线程安全问题1.1线程安全问题的原因1.2如何解决线程安全问题二、加锁2.1synchronized2.2synchronized的几种使用方式2.3synchronized的可重入性三、死锁3.1死锁的必要条件一、多线程安全问题代码示例如下:publicclassDemo20{staticintcount=0;publicstaticvoidmain(String[]args)th
- Java多线程的可重入和不可重入
@See you later
Javajava开发语言
在Java中,可重入(Reentrant)和不可重入(Non-reentrant)这两个概念通常用于描述多线程环境下的同步方法或代码块的行为。可重入(Reentrant)可重入是指一个线程持有某个锁(Lock)时,可以再次请求同一个锁而不会被锁阻塞。换句话说,如果一个线程获取了某个对象的锁,它可以再次请求这个锁而不会导致死锁。Java中的synchronized关键字就是可重入的。当一个线程获取了
- Java虚拟机是如何执行线程同步的
莫生人
在网上看到一篇老外的文章(原文地址:HowtheJavavirtualmachineperformsthreadsynchronization),介绍了线程同步相关的几个基础知识点。所以想把它翻译一下给大家看看。相信大家看过这些基础知识之后再看synchronized的原理就会好理解一点。了解Java语言的人都知道,Java代码要想被JVM执行,需要被转换成由字节码组成的class文件。本文主要来
- java高并发程序设计-锁的优化
fantasyYan2
java高并发程序设计javajvmjava多线程锁优化CAS
如何提高锁的性能减少锁持有时间即对类似如下的方法publicsynchronizedvoidsync(){a();//其实只有b需要同步处理b();c();}改进为publicvoidsync(){a();synchronized(this){b();}c();}从而减少锁的持有时间减少锁粒度如ConcurrentHashMap内部分成若干个小的HashMap,每个HashMap加不同的锁读写分离
- synchronized和Lock有什么区别?用新的Lock有什么好处?
Shaw_Young
原始构成synchronized是关键字属于JVM层面monitorenter(底层是通过monitor对象来完成的)monitorexitLock是具体类(java.util.current.locks.Lock)是api层面的锁使用方法synchronized不需要用户去手动释放锁,当synchronized代码执行完后系统会自动让线程释放对锁的占用ReentrantLock则需要用户去手动释
- synchronized常见锁策略
渡月真白
java开发语言
这里提到的锁策略仅仅是一种“策略模式”,并不是真正的锁,同理这里的锁策略不仅仅局限于java,所有编程语言都适用于这里的锁策略。锁策略1.乐观锁,悲观锁乐观锁,悲观锁并不是一把真正的锁,他描述的是一个抽象的概念,是一类锁的集合锁冲突:几个线程同时竞争一把锁,一个线程拿到锁,其余线程处于阻塞等待的状态.乐观锁:预测该场景中不太会出现锁冲突的情况.(后续做的工作会更少)悲观锁:预测该场景中会频繁出现锁
- linux事件驱动,事件驱动
糖卿
linux事件驱动
在前面的文章《双刃剑-理解多线程带来的安全问题》中,我们提到了多线程情况下存在的线程安全问题。本文将以这个问题为背景,介绍如何通过使用synchronized关键字解这一问题。...»synchronized底层原理通过反编译class文件,可以看到synchronized最关键的部分是monitor对象。又因为synchronized关键字使用的方法不同,可以将monitor对象使用分为以下两种
- 2024金九银十208道Java中高级高频面试题(含答案)
2401_85125308
java开发语言
12.什么是集合?集合和数组的区别。13.常用的集合类有哪些?它们的区别是什么?14.集合如何安全地批量删除元素?15.java怎么实现动态代理?有什么意义?16.什么是死锁?死锁产生的原因是什么?如何避免死锁?17.synchronized的作用。18.volatile关键字的作用19.线程怎么保持同步?20.什么是CAS?21.乐观锁与悲观锁?乐观锁的实现方式?22.Lock与synchron
- Java面试题
路飞Fly了
java面试开发语言
Java面试题文章目录1、抽象类和接口的区别2、重载和重写的区别3、==和equals的区别4、讲一讲什么是map、set、list5、HashMap原理6、什么是JSP?它与Servlet有什么区别7、synchronized关键字8、HashTable与HashMap的区别9、ArrayList和LinkedList的区别10、Session和Cookie的区别11、String、String
- Java 中的并发工具类详解:Semaphore、CountDownLatch 和 CyclicBarrier
swadian2008
并发编程SemaphoreCountDownLatchCyclicBarrierJava并发工具类
目录1、信号量:Semaphore2、线程同步:CountDownLatch和CyclicBarrierJava并发包提供了哪些并发工具类?我们通常所说的并发包也就是java.util.concurrent及其子包,集中了Java并发的各种基础工具类,具体主要包括几个方面:提供了比synchronized更加高级的各种同步结构,包括CountDownLatch、CyclicBarrier、Sema
- Java并发编程(五)—ReetrantLock详解及应用
echola_mendes
Java并发编程java开发语言
目录一、ReetrantLock的特性1、非阻塞获取锁2、带超时的锁获取:3、锁的公平性4、锁的可中断性5、Condition条件变量6、锁的可重入性可重入锁不可重入锁7、性能优化二、ReentrantLock和Synchronized的区别1、语法和使用方式2、锁的获取和释放3、高级特性4、条件变量5、性能总结三、ReentrantLock使用场景之前的文章Java并发编程(四)—synchro
- 线程的锁机制
我超爱学习&
javajvm开发语言
锁机制的介绍针对于临界资源安全隐患问题的解决方式。引入锁机制。1.锁机制的作用:将异步的代码块变成同步的代码块。2.语法:synchronized(锁对象的地址){//需要同步的代码块(如果不同步,就会出现安全隐患问题)}3.任何的java对象都可以作为锁。一个要求:所有的线程看到的都是同一个对象。4.同步的代码块在可能的情况下,尽量缩小范围,提高其他代码的并发效率。5.运行逻辑:当一个线程A执行
- synchronized原理
Petrichor-瑾
JavaEEjava开发语言
目录1.基本特点2.锁升级/锁膨胀2.1偏向锁2.2轻量级锁2.3重量级锁3.锁消除4.锁粗化1.基本特点结合我们前面所说的锁策略,我们可以总结出synchronized具有以下特性(在JDK1.8中):1.初始阶段采用乐观锁策略,如果锁冲突频繁发生,则切换为悲观锁。2.初始阶段使用轻量级锁实现,但如果锁持有时间较长,将转换为重量级锁。3.在实现轻量级锁时,通常会采用自旋锁策略。4.它是一种不公平
- Java源码解读-数据容器都是如何实现同步的
问道飞鱼
Java开发Java源码解读数据容器同步机制
用Java的同学可能在自己使用或者面试的时候经常遇到这么一个问题,哪些数据结构或者容器是同步的,是怎么实现的同步?其实很多的数据同步原理都比较简单,我把目前知道的数据容器的同步方式稍微梳理了一下1.线程安全容器StringBuffer(太明显,synchronized关键字)@OverridepublicsynchronizedStringBufferappend(Stringstr){toStr
- Java 内存模型-锁的内存语义
markfork
章节目录锁的释放-获取建立的happens-before关系锁的释放-获取的内存语义锁的释放-获取建立的happens-before关系锁是Java并发编程中最重要的同步机制。锁除了让临界区互斥执行之外,还可以让释放锁的线程向获取同一个锁的线程发送消息。如下所示,下面是锁释放-锁获取的示例代码classMonitorExample{inta=0;publicsynchronizedvoidwrit
- Java--多线程中wait和sleep的区别
往事一块六毛八
wait()wait()是object中的方法,可让线程进行等待,假设线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁,同时线程A就进入到了该对象的等待池中,进入到等待池中的线程不会去竞争该对象的锁。当wait()中不传参数时,jvm会默认会传一个参数0,表示永久阻塞,若传入参数,则表示在指定的时间内阻塞。wait()方法由于要释放锁,所以得写在synchronized方法或块中,
- JDK成长记16:从0分析你不知道的synchronized底层原理(下)
_程序员成长记
file上一节你了解了什么是CAS、synchronized形成的锁的类型、重量级锁是用户态进程向内核态申请资源加锁过程,HotSpotJava对象结构,以及初步从3个层面分析了下synchronized的核心流程。还记得核心流程图么?如下所示:file这一节我们仔细来分析下这个过程中,每一步的底层原理。我们需要用到一个工具包,JOL,它可以将java对象的信息打印出来。你可以通过这个工具分析升级
- Recommended order of a method's mutiple modifiers
MJN
classjava
Themethodmodifiersconsistofthefollowing:annotationsaccessmodifiersabstractstaticfinal:Afinalmethodcannotbeoverriddeninasubclass.synchronized:Asynchronizedmethodhasadditionalsemanticsrelatedtothecontro
- java 线程安全的linkedlist_使ArrayList,LinkedList变成线程安全的
肖宏辉
java线程安全的linkedlist
1.使用SynchronizedListSynchronizedList是一个线程安全的包装类。继承于SynchronizedCollection,SynchronizedCollection实现了Collection接口,SynchronizedList包含一个List对象,对List的访问修改方法进行了一些封装,在封装的方法中会对list使用同步锁加锁,然后再进行存取和修改操作。使用方法如下L
- Collection.synchronized*方法注意事项
shadon178
Java
引API的一句话:返回指定列表支持的同步(线程安全的)列表。为了保证按顺序访问,必须通过返回的列表完成所有对底层实现列表的访问。在返回的列表上进行迭代时,用户必须手工在返回的列表上进行同步:Listlist=Collections.synchronizedList(newArrayList());...synchronized(list){Iteratori=list.iterator();//M
- 23. 如何使用Collections.synchronizedList()方法来创建线程安全的集合?有哪些注意事项?
这孩子叫逆
面试题java集合java
Collections.synchronizedList()方法用于将一个普通的List包装成线程安全的List。通过这个方法生成的List,所有的访问和修改操作都会被自动加锁,从而确保在多线程环境下对集合的并发访问是安全的。如何使用Collections.synchronizedList()创建线程安全的集合以下是使用Collections.synchronizedList()创建线程安全Lis
- 16 - ReentrantLock 可重入锁
坯子蔡
并发编程并发编程多线程ReentrantLockLock可重入锁
ReentrantLock可重入锁1.ReentrantLock概念1.1背景1.2保证可见性1.3可重入锁1.4公平锁与非公平锁2.源码分析2.1类结构2.2获取锁2.3释放锁2.4如何实现重入3.总结1.ReentrantLock概念1.1背景 Java语言本身提供的synchronized也是管程的一种实现,既然Java从语言层面已经实现了管程了,那为什么还要在SDK里提供另外一种实现呢?
- 多线程中的同步
Aluha_f289
当需要资源共享的时候使用同步同步有两种方法1.synchronized的代码块语法:synchronized(对象){}2.synchronized的方法synchronizedvoid方法名(){}以下是实例classThreadDemo020implementsRunnable{privateintticket=5;publicvoidrun(){for(inti=5;i>0;i--){/*s
- ASM系列四 利用Method 组件动态注入方法逻辑
lijingyao8206
字节码技术jvmAOP动态代理ASM
这篇继续结合例子来深入了解下Method组件动态变更方法字节码的实现。通过前面一篇,知道ClassVisitor 的visitMethod()方法可以返回一个MethodVisitor的实例。那么我们也基本可以知道,同ClassVisitor改变类成员一样,MethodVIsistor如果需要改变方法成员,注入逻辑,也可以
- java编程思想 --内部类
百合不是茶
java内部类匿名内部类
内部类;了解外部类 并能与之通信 内部类写出来的代码更加整洁与优雅
1,内部类的创建 内部类是创建在类中的
package com.wj.InsideClass;
/*
* 内部类的创建
*/
public class CreateInsideClass {
public CreateInsideClass(
- web.xml报错
crabdave
web.xml
web.xml报错
The content of element type "web-app" must match "(icon?,display-
name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,s
- 泛型类的自定义
麦田的设计者
javaandroid泛型
为什么要定义泛型类,当类中要操作的引用数据类型不确定的时候。
采用泛型类,完成扩展。
例如有一个学生类
Student{
Student(){
System.out.println("I'm a student.....");
}
}
有一个老师类
- CSS清除浮动的4中方法
IT独行者
JavaScriptUIcss
清除浮动这个问题,做前端的应该再熟悉不过了,咱是个新人,所以还是记个笔记,做个积累,努力学习向大神靠近。CSS清除浮动的方法网上一搜,大概有N多种,用过几种,说下个人感受。
1、结尾处加空div标签 clear:both 1 2 3 4
.div
1
{
background
:
#000080
;
border
:
1px
s
- Cygwin使用windows的jdk 配置方法
_wy_
jdkwindowscygwin
1.[vim /etc/profile]
JAVA_HOME="/cgydrive/d/Java/jdk1.6.0_43" (windows下jdk路径为D:\Java\jdk1.6.0_43)
PATH="$JAVA_HOME/bin:${PATH}"
CLAS
- linux下安装maven
无量
mavenlinux安装
Linux下安装maven(转) 1.首先到Maven官网
下载安装文件,目前最新版本为3.0.3,下载文件为
apache-maven-3.0.3-bin.tar.gz,下载可以使用wget命令;
2.进入下载文件夹,找到下载的文件,运行如下命令解压
tar -xvf apache-maven-2.2.1-bin.tar.gz
解压后的文件夹
- tomcat的https 配置,syslog-ng配置
aichenglong
tomcathttp跳转到httpssyslong-ng配置syslog配置
1) tomcat配置https,以及http自动跳转到https的配置
1)TOMCAT_HOME目录下生成密钥(keytool是jdk中的命令)
keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit
- 关于领号活动总结
alafqq
活动
关于某彩票活动的总结
具体需求,每个用户进活动页面,领取一个号码,1000中的一个;
活动要求
1,随机性,一定要有随机性;
2,最少中奖概率,如果注数为3200注,则最多中4注
3,效率问题,(不能每个人来都产生一个随机数,这样效率不高);
4,支持断电(仍然从下一个开始),重启服务;(存数据库有点大材小用,因此不能存放在数据库)
解决方案
1,事先产生随机数1000个,并打
- java数据结构 冒泡排序的遍历与排序
百合不是茶
java
java的冒泡排序是一种简单的排序规则
冒泡排序的原理:
比较两个相邻的数,首先将最大的排在第一个,第二次比较第二个 ,此后一样;
针对所有的元素重复以上的步骤,除了最后一个
例题;将int array[]
- JS检查输入框输入的是否是数字的一种校验方法
bijian1013
js
如下是JS检查输入框输入的是否是数字的一种校验方法:
<form method=post target="_blank">
数字:<input type="text" name=num onkeypress="checkNum(this.form)"><br>
</form>
- Test注解的两个属性:expected和timeout
bijian1013
javaJUnitexpectedtimeout
JUnit4:Test文档中的解释:
The Test annotation supports two optional parameters.
The first, expected, declares that a test method should throw an exception.
If it doesn't throw an exception or if it
- [Gson二]继承关系的POJO的反序列化
bit1129
POJO
父类
package inheritance.test2;
import java.util.Map;
public class Model {
private String field1;
private String field2;
private Map<String, String> infoMap
- 【Spark八十四】Spark零碎知识点记录
bit1129
spark
1. ShuffleMapTask的shuffle数据在什么地方记录到MapOutputTracker中的
ShuffleMapTask的runTask方法负责写数据到shuffle map文件中。当任务执行完成成功,DAGScheduler会收到通知,在DAGScheduler的handleTaskCompletion方法中完成记录到MapOutputTracker中
- WAS各种脚本作用大全
ronin47
WAS 脚本
http://www.ibm.com/developerworks/cn/websphere/library/samples/SampleScripts.html
无意中,在WAS官网上发现的各种脚本作用,感觉很有作用,先与各位分享一下
获取下载
这些示例 jacl 和 Jython 脚本可用于在 WebSphere Application Server 的不同版本中自
- java-12.求 1+2+3+..n不能使用乘除法、 for 、 while 、 if 、 else 、 switch 、 case 等关键字以及条件判断语句
bylijinnan
switch
借鉴网上的思路,用java实现:
public class NoIfWhile {
/**
* @param args
*
* find x=1+2+3+....n
*/
public static void main(String[] args) {
int n=10;
int re=find(n);
System.o
- Netty源码学习-ObjectEncoder和ObjectDecoder
bylijinnan
javanetty
Netty中传递对象的思路很直观:
Netty中数据的传递是基于ChannelBuffer(也就是byte[]);
那把对象序列化为字节流,就可以在Netty中传递对象了
相应的从ChannelBuffer恢复对象,就是反序列化的过程
Netty已经封装好ObjectEncoder和ObjectDecoder
先看ObjectEncoder
ObjectEncoder是往外发送
- spring 定时任务中cronExpression表达式含义
chicony
cronExpression
一个cron表达式有6个必选的元素和一个可选的元素,各个元素之间是以空格分隔的,从左至右,这些元素的含义如下表所示:
代表含义 是否必须 允许的取值范围 &nb
- Nutz配置Jndi
ctrain
JNDI
1、使用JNDI获取指定资源:
var ioc = {
dao : {
type :"org.nutz.dao.impl.NutDao",
args : [ {jndi :"jdbc/dataSource"} ]
}
}
以上方法,仅需要在容器中配置好数据源,注入到NutDao即可.
- 解决 /bin/sh^M: bad interpreter: No such file or directory
daizj
shell
在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory。
分析:这是不同系统编码格式引起的:在windows系统中编辑的.sh文件可能有不可见字符,所以在Linux系统下执行会报以上异常信息。
解决:
1)在windows下转换:
利用一些编辑器如UltraEdit或EditPlus等工具
- [转]for 循环为何可恨?
dcj3sjt126com
程序员读书
Java的闭包(Closure)特征最近成为了一个热门话题。 一些精英正在起草一份议案,要在Java将来的版本中加入闭包特征。 然而,提议中的闭包语法以及语言上的这种扩充受到了众多Java程序员的猛烈抨击。
不久前,出版过数十本编程书籍的大作家Elliotte Rusty Harold发表了对Java中闭包的价值的质疑。 尤其是他问道“for 循环为何可恨?”[http://ju
- Android实用小技巧
dcj3sjt126com
android
1、去掉所有Activity界面的标题栏
修改AndroidManifest.xml 在application 标签中添加android:theme="@android:style/Theme.NoTitleBar"
2、去掉所有Activity界面的TitleBar 和StatusBar
修改AndroidManifes
- Oracle 复习笔记之序列
eksliang
Oracle 序列sequenceOracle sequence
转载请出自出处:http://eksliang.iteye.com/blog/2098859
1.序列的作用
序列是用于生成唯一、连续序号的对象
一般用序列来充当数据库表的主键值
2.创建序列语法如下:
create sequence s_emp
start with 1 --开始值
increment by 1 --増长值
maxval
- 有“品”的程序员
gongmeitao
工作
完美程序员的10种品质
完美程序员的每种品质都有一个范围,这个范围取决于具体的问题和背景。没有能解决所有问题的
完美程序员(至少在我们这个星球上),并且对于特定问题,完美程序员应该具有以下品质:
1. 才智非凡- 能够理解问题、能够用清晰可读的代码翻译并表达想法、善于分析并且逻辑思维能力强
(范围:用简单方式解决复杂问题)
- 使用KeleyiSQLHelper类进行分页查询
hvt
sql.netC#asp.nethovertree
本文适用于sql server单主键表或者视图进行分页查询,支持多字段排序。KeleyiSQLHelper类的最新代码请到http://hovertree.codeplex.com/SourceControl/latest下载整个解决方案源代码查看。或者直接在线查看类的代码:http://hovertree.codeplex.com/SourceControl/latest#HoverTree.D
- SVG 教程 (三)圆形,椭圆,直线
天梯梦
svg
SVG <circle> SVG 圆形 - <circle>
<circle> 标签可用来创建一个圆:
下面是SVG代码:
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<circle cx="100" c
- 链表栈
luyulong
java数据结构
public class Node {
private Object object;
private Node next;
public Node() {
this.next = null;
this.object = null;
}
public Object getObject() {
return object;
}
public
- 基础数据结构和算法十:2-3 search tree
sunwinner
Algorithm2-3 search tree
Binary search tree works well for a wide variety of applications, but they have poor worst-case performance. Now we introduce a type of binary search tree where costs are guaranteed to be loga
- spring配置定时任务
stunizhengjia
springtimer
最近因工作的需要,用到了spring的定时任务的功能,觉得spring还是很智能化的,只需要配置一下配置文件就可以了,在此记录一下,以便以后用到:
//------------------------定时任务调用的方法------------------------------
/**
* 存储过程定时器
*/
publi
- ITeye 8月技术图书有奖试读获奖名单公布
ITeye管理员
活动
ITeye携手博文视点举办的8月技术图书有奖试读活动已圆满结束,非常感谢广大用户对本次活动的关注与参与。
8月试读活动回顾:
http://webmaster.iteye.com/blog/2102830
本次技术图书试读活动的优秀奖获奖名单及相应作品如下(优秀文章有很多,但名额有限,没获奖并不代表不优秀):
《跨终端Web》
gleams:http