Redian新闻
>
size() method 为什么需要多线程保护?
avatar
size() method 为什么需要多线程保护?# Java - 爪哇娇娃
r*r
1
比如,Vector 的两个方法:
public synchronized int capacity() {
return elementData.length;
}
public synchronized int size() {
return elementCount;
}
elementCount 是 int. 学多线程,不明白。无修改操作,为什么需要保护?
avatar
t*a
2
别的method有改elementCount啊

【在 r******r 的大作中提到】
: 比如,Vector 的两个方法:
: public synchronized int capacity() {
: return elementData.length;
: }
: public synchronized int size() {
: return elementCount;
: }
: elementCount 是 int. 学多线程,不明白。无修改操作,为什么需要保护?

avatar
r*r
3
如果考虑其他 method 的影响,那对单个 method 的保护好像就没什么意义?为了安全
,就需要保护整个对象。
我看到,说 getter method 一般是安全的,无需保护。

【在 t***a 的大作中提到】
: 别的method有改elementCount啊
avatar
t*a
4
刚才那个synchronized加在method前面,基本相当于
synchronized(this){

}
你下面这个是构造函数。。。。。你觉得能俩线程create出同一个instance么?

【在 r******r 的大作中提到】
: 如果考虑其他 method 的影响,那对单个 method 的保护好像就没什么意义?为了安全
: ,就需要保护整个对象。
: 我看到,说 getter method 一般是安全的,无需保护。

avatar
r*r
5
sorry,看错了,那是个 constructor,已删掉了。

【在 t***a 的大作中提到】
: 刚才那个synchronized加在method前面,基本相当于
: synchronized(this){
:
: }
: 你下面这个是构造函数。。。。。你觉得能俩线程create出同一个instance么?

avatar
N*m
6
你的多线程概念很混乱阿,建议先看看wiki

【在 r******r 的大作中提到】
: 比如,Vector 的两个方法:
: public synchronized int capacity() {
: return elementData.length;
: }
: public synchronized int size() {
: return elementCount;
: }
: elementCount 是 int. 学多线程,不明白。无修改操作,为什么需要保护?

avatar
r*r
7
这种观点呢?别人的
“我一直认为java.util里那些所谓线程安全的集合对象都是垃圾。基于单个方法的同
步在实际应用中基本上不起什么作用,其负面作用是很多人以为直接用这些对象就能保
证线程安全。
想楼主的代码中提到的场景经常出现,要保证线程安全就必需自己用synchronized把整
个代码片段包起来。”
意思是说,不保护单个方法,在用户建立了一个 Vector v 对象后,对整个 v 保护。
synchronized(v){
}
我觉得这两种方法好像还是有性能上的区别,但是保护对象是最安全,最简单,最直观
的。如果自己设计一个类,选择哪种方式较好?

【在 t***a 的大作中提到】
: 刚才那个synchronized加在method前面,基本相当于
: synchronized(this){
:
: }
: 你下面这个是构造函数。。。。。你觉得能俩线程create出同一个instance么?

avatar
r*r
8
是啊。多线程程序,试了一下,在 eclipse 里 debug,好像也与单线程不一样,不太
好 track 逻辑。

【在 N***m 的大作中提到】
: 你的多线程概念很混乱阿,建议先看看wiki
avatar
t*a
9
你转出来的东西我看不下去。。。。。。就像前面那哥们说的,哪怕你看看wiki嘛

【在 r******r 的大作中提到】
: 这种观点呢?别人的
: “我一直认为java.util里那些所谓线程安全的集合对象都是垃圾。基于单个方法的同
: 步在实际应用中基本上不起什么作用,其负面作用是很多人以为直接用这些对象就能保
: 证线程安全。
: 想楼主的代码中提到的场景经常出现,要保证线程安全就必需自己用synchronized把整
: 个代码片段包起来。”
: 意思是说,不保护单个方法,在用户建立了一个 Vector v 对象后,对整个 v 保护。
: synchronized(v){
: }
: 我觉得这两种方法好像还是有性能上的区别,但是保护对象是最安全,最简单,最直观

avatar
w*z
10
Vector is deprecated long long ago.

【在 r******r 的大作中提到】
: 比如,Vector 的两个方法:
: public synchronized int capacity() {
: return elementData.length;
: }
: public synchronized int size() {
: return elementCount;
: }
: elementCount 是 int. 学多线程,不明白。无修改操作,为什么需要保护?

avatar
m*n
11
Your question is a very good one. It touches on both points of multithreaded
programming:
Synchronization and memory coherency (memory barrier). Had vector been
implemented in java 1.5 or later, it wouldn't make much sense to synchronize
on these two methods. It's enough to declare the relevant vars as volatile.
But pre-1.5 volatile semantics was different, and synchronized was the only
way to add memory barrier.

【在 r******r 的大作中提到】
: 比如,Vector 的两个方法:
: public synchronized int capacity() {
: return elementData.length;
: }
: public synchronized int size() {
: return elementCount;
: }
: elementCount 是 int. 学多线程,不明白。无修改操作,为什么需要保护?

avatar
p*2
12
Int操作是atomic的所以应该没有race condition的问题 主要是解决visibility吧 用
volitile 差不多了

【在 t***a 的大作中提到】
: 别的method有改elementCount啊
avatar
c*e
13
你说的“
不保护单个方法,在用户建立了一个 Vector v 对象后,对整个 v 保护。
synchronized(v){
}”
这个没有保护单个方法的效率高。
保护单个方法是最高效的方法。

【在 r******r 的大作中提到】
: 这种观点呢?别人的
: “我一直认为java.util里那些所谓线程安全的集合对象都是垃圾。基于单个方法的同
: 步在实际应用中基本上不起什么作用,其负面作用是很多人以为直接用这些对象就能保
: 证线程安全。
: 想楼主的代码中提到的场景经常出现,要保证线程安全就必需自己用synchronized把整
: 个代码片段包起来。”
: 意思是说,不保护单个方法,在用户建立了一个 Vector v 对象后,对整个 v 保护。
: synchronized(v){
: }
: 我觉得这两种方法好像还是有性能上的区别,但是保护对象是最安全,最简单,最直观

avatar
t*a
14
这个地方还是得用synchronize
size和elements需要一起改变,也就是说多个operation要和在一个atomic operation里

【在 p*****2 的大作中提到】
: Int操作是atomic的所以应该没有race condition的问题 主要是解决visibility吧 用
: volitile 差不多了

avatar
p*2
15

operation里
没看到哪里改elements了

【在 t***a 的大作中提到】
: 这个地方还是得用synchronize
: size和elements需要一起改变,也就是说多个operation要和在一个atomic operation里

avatar
c*e
16
elementcount可能在别的method里被改变。

【在 p*****2 的大作中提到】
:
: operation里
: 没看到哪里改elements了

avatar
p*2
17
跟 get size有什么关系呢

【在 c*********e 的大作中提到】
: elementcount可能在别的method里被改变。
avatar
t*a
18
比如说remove()如果是这么写的
removeElement()
count --
显然remove是synchronized
如果size()不synchronized的话,就可能会拿到不对count, 而这时候element已经被
remove掉

【在 p*****2 的大作中提到】
: 跟 get size有什么关系呢
avatar
r*r
19
请教两个基本问题;
1. 如果程序要在多线程中运行,是不是在写每个类的时候,都要考虑多线程保护?
Immutable 的除外。因为看了公司的很多代码,都只有零星的保护。很多都完全没有,
但它们并非都是 immutable.
或者换个问题,怎么判断一个系统中的很多类,哪些需要保护,而哪些不需要保护?
2. 如果不考虑效率,是不是对每个涉及到成员变量修改的方法,包括 getter 和
setter,都使用 synchronized,就可以确保线程安全了。如果这样,好像大都类都需
要保护?

【在 t***a 的大作中提到】
: 比如说remove()如果是这么写的
: removeElement()
: count --
: 显然remove是synchronized
: 如果size()不synchronized的话,就可能会拿到不对count, 而这时候element已经被
: remove掉

avatar
t*a
20
要不请赵老师来回答一下吧。。。
我觉得这事得case by case.....

?

【在 r******r 的大作中提到】
: 请教两个基本问题;
: 1. 如果程序要在多线程中运行,是不是在写每个类的时候,都要考虑多线程保护?
: Immutable 的除外。因为看了公司的很多代码,都只有零星的保护。很多都完全没有,
: 但它们并非都是 immutable.
: 或者换个问题,怎么判断一个系统中的很多类,哪些需要保护,而哪些不需要保护?
: 2. 如果不考虑效率,是不是对每个涉及到成员变量修改的方法,包括 getter 和
: setter,都使用 synchronized,就可以确保线程安全了。如果这样,好像大都类都需
: 要保护?

avatar
p*2
21
elements跟size两个变量 不会有race condition呀

【在 t***a 的大作中提到】
: 比如说remove()如果是这么写的
: removeElement()
: count --
: 显然remove是synchronized
: 如果size()不synchronized的话,就可能会拿到不对count, 而这时候element已经被
: remove掉

avatar
r*r
22
size() 是方法,elements 是变量。后者变了,size 怎能不变。
不过,简单问题,反而容易把人问糊涂。

【在 p*****2 的大作中提到】
: elements跟size两个变量 不会有race condition呀
avatar
t*a
23
er....原来你是这么看的。。。。。
不过这两个field不都是vector object的属性么?synchronized加的锁也是在this上的
所以这个race condition是发生在"this"(就是这个vector object)上的

【在 p*****2 的大作中提到】
: elements跟size两个变量 不会有race condition呀
avatar
p*2
24
我看你给的函数里边返回的是单独一个变量

【在 r******r 的大作中提到】
: size() 是方法,elements 是变量。后者变了,size 怎能不变。
: 不过,简单问题,反而容易把人问糊涂。

avatar
p*2
25

Size只是返回一个属性 跟vector有什么关系呢 他只访问了一个属性 没有访问整个
vector

【在 t***a 的大作中提到】
: er....原来你是这么看的。。。。。
: 不过这两个field不都是vector object的属性么?synchronized加的锁也是在this上的
: 所以这个race condition是发生在"this"(就是这个vector object)上的

avatar
t*a
26
这个size就是vector的member啊,它只访问一个属性有什么关系,锁在整个object上,
这个synchronized加在size上是为了防止有race condition发生在整个vector上
我刚才不是举了那个remove的例子了么。。。。。如果有remove和size同时在两个
thread中,这不就对整个vector有race condition了么

【在 p*****2 的大作中提到】
:
: Size只是返回一个属性 跟vector有什么关系呢 他只访问了一个属性 没有访问整个
: vector

avatar
p*2
27

这个帖子不是讨论size这个函数是不是需要加锁吗?size只是访问了一个属性,你认为
会有race condition?

【在 t***a 的大作中提到】
: 这个size就是vector的member啊,它只访问一个属性有什么关系,锁在整个object上,
: 这个synchronized加在size上是为了防止有race condition发生在整个vector上
: 我刚才不是举了那个remove的例子了么。。。。。如果有remove和size同时在两个
: thread中,这不就对整个vector有race condition了么

avatar
p*2
28
public synchronized int size() {
return elementCount;
}
具体点吧。LZ给的这个函数为什么一定需要加锁?函数只是一句话,return
elementCount。为什么会有race condition?
avatar
t*a
29
是啊,我认为会有race condition在整个vector上,所以那个synchronzized是必须的

【在 p*****2 的大作中提到】
: public synchronized int size() {
: return elementCount;
: }
: 具体点吧。LZ给的这个函数为什么一定需要加锁?函数只是一句话,return
: elementCount。为什么会有race condition?

avatar
c*e
30
你没学过 操作系統 吧,里面关于process,thread讲得非常清楚。

【在 p*****2 的大作中提到】
: 跟 get size有什么关系呢
avatar
r*r
31
如果 thread 1 & 2 在 time T 同时调用 remove() & size(),可能 elementCount 就
会出现 inconsistent 的情况。
我是这么认为的。

【在 p*****2 的大作中提到】
: public synchronized int size() {
: return elementCount;
: }
: 具体点吧。LZ给的这个函数为什么一定需要加锁?函数只是一句话,return
: elementCount。为什么会有race condition?

avatar
p*2
32

为什么会inconsistent?

【在 r******r 的大作中提到】
: 如果 thread 1 & 2 在 time T 同时调用 remove() & size(),可能 elementCount 就
: 会出现 inconsistent 的情况。
: 我是这么认为的。

avatar
p*2
33

这个问题有点sha了。

【在 c*********e 的大作中提到】
: 你没学过 操作系統 吧,里面关于process,thread讲得非常清楚。
avatar
p*2
34

size是vector的一个函数,elementcount是vector的一个属性。
都是对象内部的。你说的是对象外部的操作。
对象内部讨论的话,你没有必要考虑整个vector了。不是一个level的操作。

【在 t***a 的大作中提到】
: 是啊,我认为会有race condition在整个vector上,所以那个synchronzized是必须的
avatar
r*r
35
我想得也不是特别清楚,但是 race condition 解释的大意就是说,多线程容易造成某
个数据量的值还未来得及更新,就被另一个线程访问到了。比如说,remove() 把 v's
size (elementCount) 在时间点 T 从 4 降到了 3,但是 concurrent 的线程 size(
) 可能还只会返回过去的值 4.如果是两个线程是 sequential 就不存在这个问题,但
是 concurrent 就会有这个问题。

【在 p*****2 的大作中提到】
:
: size是vector的一个函数,elementcount是vector的一个属性。
: 都是对象内部的。你说的是对象外部的操作。
: 对象内部讨论的话,你没有必要考虑整个vector了。不是一个level的操作。

avatar
p*2
36

s
size(
volatile 不可以解决这个问题吗?

【在 r******r 的大作中提到】
: 我想得也不是特别清楚,但是 race condition 解释的大意就是说,多线程容易造成某
: 个数据量的值还未来得及更新,就被另一个线程访问到了。比如说,remove() 把 v's
: size (elementCount) 在时间点 T 从 4 降到了 3,但是 concurrent 的线程 size(
: ) 可能还只会返回过去的值 4.如果是两个线程是 sequential 就不存在这个问题,但
: 是 concurrent 就会有这个问题。

avatar
r*r
37
volatile 好像也可以,问题是原来的 Vector 中,elementCount 定义为普通的 int,
没有 volatile。
至于 Vector 中为何没用 volatile, 就不清楚原因了。或许是不合适,或许是另一种
选择而已。不过, volatile 好像用得并不多。

【在 p*****2 的大作中提到】
:
: s
: size(
: volatile 不可以解决这个问题吗?

avatar
p*2
38

,
上边已经解释过了。vector的时候java volatile实现有问题,所以只能用lock了。现
在就不需要一定用lock了。而且上边也解释了,vector已经deprecated了。

【在 r******r 的大作中提到】
: volatile 好像也可以,问题是原来的 Vector 中,elementCount 定义为普通的 int,
: 没有 volatile。
: 至于 Vector 中为何没用 volatile, 就不清楚原因了。或许是不合适,或许是另一种
: 选择而已。不过, volatile 好像用得并不多。

avatar
r*r
39
再问个与 Vector deprecated 相关的问题。如果不用 Vector, 就用 Collections.
synchronizedCollection(...). 因为它返回一个 “a synchronized (thread-safe)
collection backed by the specified collection. ”。
public static Collection synchronizedCollection(Collection c) {
return new SynchronizedCollection(c);
}
但是,在使用的时候,为何还要对返回的 collection c 再次 synchronized(c),如下
。不是已经安全了吗?
Collection c = Collections.synchronizedCollection(myCollection);
...
synchronized(c) {
Iterator i = c.iterator(); // Must be in the synchronized block
while (i.hasNext())
foo(i.next());
}
再看 SynchronizedCollection 的实现,好像已经做了充分的内部保护。比如,这里每
个方法中保护 mutex 与 Vector 中 synchronized int size() 有什么区别。
static class SynchronizedCollection implements Collection,
Serializable {
// use serialVersionUID from JDK 1.2.2 for interoperability
private static final long serialVersionUID = 3053995032091335093L;
final Collection c; // Backing Collection
final Object mutex; // Object on which to synchronize
SynchronizedCollection(Collection c) {
if (c==null)
throw new NullPointerException();
this.c = c;
mutex = this;
}
SynchronizedCollection(Collection c, Object mutex) {
this.c = c;
this.mutex = mutex;
}
public int size() {
synchronized(mutex) {return c.size();}
}
public boolean isEmpty() {
synchronized(mutex) {return c.isEmpty();}
}
public boolean contains(Object o) {
synchronized(mutex) {return c.contains(o);}
}
public Object[] toArray() {
synchronized(mutex) {return c.toArray();}
}
public T[] toArray(T[] a) {
synchronized(mutex) {return c.toArray(a);}
}
public Iterator iterator() {
return c.iterator(); // Must be manually synched by user!
}
public boolean add(E e) {
synchronized(mutex) {return c.add(e);}
}
public boolean remove(Object o) {
synchronized(mutex) {return c.remove(o);}
}
public boolean containsAll(Collection coll) {
synchronized(mutex) {return c.containsAll(coll);}
}
public boolean addAll(Collection coll) {
synchronized(mutex) {return c.addAll(coll);}
}
public boolean removeAll(Collection coll) {
synchronized(mutex) {return c.removeAll(coll);}
}
public boolean retainAll(Collection coll) {
synchronized(mutex) {return c.retainAll(coll);}
}
public void clear() {
synchronized(mutex) {c.clear();}
}
public String toString() {
synchronized(mutex) {return c.toString();}
}
private void writeObject(ObjectOutputStream s) throws IOException {
synchronized(mutex) {s.defaultWriteObject();}
}
}
avatar
p*2
40

明显会有race condition。用不用lock的比较基本的分析是会不会有race condition。
你从这个角度一分析就知道需不需要lock了。

【在 r******r 的大作中提到】
: 再问个与 Vector deprecated 相关的问题。如果不用 Vector, 就用 Collections.
: synchronizedCollection(...). 因为它返回一个 “a synchronized (thread-safe)
: collection backed by the specified collection. ”。
: public static Collection synchronizedCollection(Collection c) {
: return new SynchronizedCollection(c);
: }
: 但是,在使用的时候,为何还要对返回的 collection c 再次 synchronized(c),如下
: 。不是已经安全了吗?
: Collection c = Collections.synchronizedCollection(myCollection);
: ...

avatar
n*e
41
同意这个解释

【在 t***a 的大作中提到】
: 是啊,我认为会有race condition在整个vector上,所以那个synchronzized是必须的
avatar
z*3
42

理论上是的,所以一般java教材都包含有多线程这一章
?
理论上作为程序员应该思考哪些资源在并发环境下需要保护
这也是多线程比较challenging的地方
所以写core java的要求比写j2ee要高,j2ee大多数时候不用考虑多线程的问题
当然这也只是理论上,实际上写j2ee还是要懂一点
另外,1.5之后,有了concurrency包,所以如果有并发的问题
就用这个包里面的类,如果没有并发的问题,就用util等类
vector,hashtable什么已经可以说是过时了,但是旧的代码里面还有很多
一般情况下,每一个线程都保有local变量,这样就不会冲突,参考threadlocal
这个应该在hibernate里面见得比较多
真正需要考虑冲突的是map这些,这种一般有两种情况
一种是读进去之后就几乎不改了,比如读取配置文件,那这种尽可能多使用hashmap这些
只有当真的是读写同时比较多出现的时候,那才会用到hashtable这些“线程安全”的
工具类
当然,前面也说了,现在用concurrency包里面的类来替换hashtable这些工具类
map在concurrency包里面是concurrenthashmap

【在 r******r 的大作中提到】
: 请教两个基本问题;
: 1. 如果程序要在多线程中运行,是不是在写每个类的时候,都要考虑多线程保护?
: Immutable 的除外。因为看了公司的很多代码,都只有零星的保护。很多都完全没有,
: 但它们并非都是 immutable.
: 或者换个问题,怎么判断一个系统中的很多类,哪些需要保护,而哪些不需要保护?
: 2. 如果不考虑效率,是不是对每个涉及到成员变量修改的方法,包括 getter 和
: setter,都使用 synchronized,就可以确保线程安全了。如果这样,好像大都类都需
: 要保护?

avatar
z*3
43
几个多线程类
vector, hashtable都是线程安全的,synchronized了
但是效率比较低,因为改变里面任何一个element都要lock整个对象
那么为了提高效率
后来线程不安全的hashmap和arraylist大行其道
为了让程序员摆脱多线程思考的痛苦
java.util.concurrent包里面推出了
concurrenthashmap和copyandwritearraylist这些类
这些类是线程安全的,但是提高了效率,并发时候操作这些类是安全的
所以理论上应该用这些类替换vector这些老类
类似的
hashset也是线程不安全的
如果需要线程安全用
copyandwritehashset
另外,stringbuffer是线程安全的
在不需要考虑线程安全的环境中
用stringbuilder效率高
借用古德霸说过的一句话总结
尽可能多用线程不安全的类,只有当你不得不用的时候才用线程安全的类
avatar
c*m
44
并发环境下,精确的size没啥用,所以后来的concurrency package里面把同步保护都
去掉了。你的程序也不应该依赖精确的size来做事。
avatar
r*r
45
能不能详细说说这个“concurrency package里面把同步保护都去掉了”, 什么意思?

【在 c*m 的大作中提到】
: 并发环境下,精确的size没啥用,所以后来的concurrency package里面把同步保护都
: 去掉了。你的程序也不应该依赖精确的size来做事。

avatar
r*r
46
谢谢。
ThreadLocal 相对于 synchronized, 好像用得比较少,需要研究。
为什么 JAVA EE 里面,不用怎么考虑多线程的问题?
另外, 我觉得 Java 程序员,应该有至少一半以上,是写 core java 程序的吧?
每一个具体应用,跟 EE 都关系不大。

【在 z*******3 的大作中提到】
: 几个多线程类
: vector, hashtable都是线程安全的,synchronized了
: 但是效率比较低,因为改变里面任何一个element都要lock整个对象
: 那么为了提高效率
: 后来线程不安全的hashmap和arraylist大行其道
: 为了让程序员摆脱多线程思考的痛苦
: java.util.concurrent包里面推出了
: concurrenthashmap和copyandwritearraylist这些类
: 这些类是线程安全的,但是提高了效率,并发时候操作这些类是安全的
: 所以理论上应该用这些类替换vector这些老类

avatar
p*2
47

貌似不到10%

【在 r******r 的大作中提到】
: 谢谢。
: ThreadLocal 相对于 synchronized, 好像用得比较少,需要研究。
: 为什么 JAVA EE 里面,不用怎么考虑多线程的问题?
: 另外, 我觉得 Java 程序员,应该有至少一半以上,是写 core java 程序的吧?
: 每一个具体应用,跟 EE 都关系不大。

avatar
r*r
48
这个纯粹是你的感觉吧。拿 Google 来说,就那么个简单前台界面,后面的应用程序成
百上千,有 JAVA 应该占相当一部分,出了 C++。

【在 p*****2 的大作中提到】
:
: 貌似不到10%

avatar
t*a
49
ThreadLocal还是用的挺多的。。。。今天上午我还新写了一个用threadLocal的类
比如说hibernate管理session之类的,还挺常用的,但在tomcat这样的app server上要
慎用

【在 r******r 的大作中提到】
: 谢谢。
: ThreadLocal 相对于 synchronized, 好像用得比较少,需要研究。
: 为什么 JAVA EE 里面,不用怎么考虑多线程的问题?
: 另外, 我觉得 Java 程序员,应该有至少一半以上,是写 core java 程序的吧?
: 每一个具体应用,跟 EE 都关系不大。

avatar
r*r
50
我对 ThreadLocal 一直很敬畏,要好好学习。我需要做的不是 EE 程序,thread 避免
不了的。
ThreadLocal 会不会增加 memory usage, 因为每个 thread 都要保存同一个变量。

【在 t***a 的大作中提到】
: ThreadLocal还是用的挺多的。。。。今天上午我还新写了一个用threadLocal的类
: 比如说hibernate管理session之类的,还挺常用的,但在tomcat这样的app server上要
: 慎用

avatar
p*2
51

java!=java core

【在 r******r 的大作中提到】
: 这个纯粹是你的感觉吧。拿 Google 来说,就那么个简单前台界面,后面的应用程序成
: 百上千,有 JAVA 应该占相当一部分,出了 C++。

avatar
r*r
52
看清楚了,我是说 core 至少要占到 50%,那另一半就是 EE 的了。而且,EE 也离不开
core, core 应该是基础吧。

【在 p*****2 的大作中提到】
:
: java!=java core

avatar
p*2
53

那你要这么说100%都是core了。

【在 r******r 的大作中提到】
: 看清楚了,我是说 core 至少要占到 50%,那另一半就是 EE 的了。而且,EE 也离不开
: core, core 应该是基础吧。

avatar
t*a
54
好啦,core怎么都要的。。。。EE对于这里多数人来说,也是怎么都要的。。。。

【在 r******r 的大作中提到】
: 看清楚了,我是说 core 至少要占到 50%,那另一半就是 EE 的了。而且,EE 也离不开
: core, core 应该是基础吧。

avatar
z*3
55
有些对象生成是必需的
用完能被gc掉的对象都不怎么考虑memory usage
唯一要考虑的是gc的pause
这个需要调整jvm参数来搞定
对于无状态组件,用singleton来节省usage
用spring的话,就不需要自己去实现singleton了
这就是j2ee的好处,总能找到合适的工具来帮忙做事

【在 r******r 的大作中提到】
: 我对 ThreadLocal 一直很敬畏,要好好学习。我需要做的不是 EE 程序,thread 避免
: 不了的。
: ThreadLocal 会不会增加 memory usage, 因为每个 thread 都要保存同一个变量。

avatar
z*3
56
synchronized用在多个线程之间共享对象
但是实际工作中,这种情况都会被尽量避开
现在机器很强大了,也不用太过于担心一些对象的使用问题
就是说如果不同线程之间的对象需要交流的话
要注意override hashcode()来判断不同线程使用的对象是否指代同一个东西
写core java的程序员没有那么多
因为j2ee有大量的工具帮忙做事,开源的收费的都有
一般情况下,不用rebuild wheels
直接拿来用就好了,应该说每一个具体的应用,大部分都是j2ee的范畴
j2ee就是用来做这事的
google不一样,google后台系统的核心是他们自己写的一个东西
写出来的时候就用c++写的,所以再扩展的时候,就不得不上core java去实现
google也有钱和时间让人这么倒腾,其它公司则多数做不到
平均而言core java程序员工资比j2ee的要高
因为j2ee里面有很多初入行的会拉低平均值
大多数人做java起步应该都是从做j2ee开始,而且很大一部分是从做web开始

【在 r******r 的大作中提到】
: 谢谢。
: ThreadLocal 相对于 synchronized, 好像用得比较少,需要研究。
: 为什么 JAVA EE 里面,不用怎么考虑多线程的问题?
: 另外, 我觉得 Java 程序员,应该有至少一半以上,是写 core java 程序的吧?
: 每一个具体应用,跟 EE 都关系不大。

avatar
p*2
57

大牛能不能说说具体J2EE学习什么技术呢?现在说J2EE是不是就是指Spring+Hibernate
? 记得你们说过struct也不行了。我前两天看了一下,J2EE那一整套技术东西不少,不
清楚那些真的有用。

【在 z*******3 的大作中提到】
: synchronized用在多个线程之间共享对象
: 但是实际工作中,这种情况都会被尽量避开
: 现在机器很强大了,也不用太过于担心一些对象的使用问题
: 就是说如果不同线程之间的对象需要交流的话
: 要注意override hashcode()来判断不同线程使用的对象是否指代同一个东西
: 写core java的程序员没有那么多
: 因为j2ee有大量的工具帮忙做事,开源的收费的都有
: 一般情况下,不用rebuild wheels
: 直接拿来用就好了,应该说每一个具体的应用,大部分都是j2ee的范畴
: j2ee就是用来做这事的

avatar
c*m
58

JEE不过是个platform/framework/tools set,本质上跟spring,hibernate, struts没
啥不同,只不过SUN把这套东西合在一起又搞了个标准,而且前中后端都涵盖了,算是
个成套产品。
不管用啥,你日常编程不还是要用core java。就算有些东西比如多线程在JEE的时候大
多有container帮你完成,你自己还是得搞清楚,尤其是哪些是thread safe的,哪些不
是,不然这活没法干了。

【在 p*****2 的大作中提到】
:
: 大牛能不能说说具体J2EE学习什么技术呢?现在说J2EE是不是就是指Spring+Hibernate
: ? 记得你们说过struct也不行了。我前两天看了一下,J2EE那一整套技术东西不少,不
: 清楚那些真的有用。

avatar
g*g
59
Most classes in concurrency package allow concurrent access. Therefore size
is not accurate.

【在 r******r 的大作中提到】
: 能不能详细说说这个“concurrency package里面把同步保护都去掉了”, 什么意思?
avatar
g*g
60
Well, I think one big difference is that these need JEE container, while the
light weight frameworks can work in and out of JEE containers.

【在 c*m 的大作中提到】
:
: JEE不过是个platform/framework/tools set,本质上跟spring,hibernate, struts没
: 啥不同,只不过SUN把这套东西合在一起又搞了个标准,而且前中后端都涵盖了,算是
: 个成套产品。
: 不管用啥,你日常编程不还是要用core java。就算有些东西比如多线程在JEE的时候大
: 多有container帮你完成,你自己还是得搞清楚,尤其是哪些是thread safe的,哪些不
: 是,不然这活没法干了。

avatar
r*r
61
I feel members like "size" & "capacity" are highly time sensitive in
multiple threading environment. It's accurate at a time point。By‘not
accurate', I think you mean the value of size changes quickly because of
concurrent accesses. It doesn't really mean it's wrong; otherwise the
concurrency isn't thread safe, which isn't the case.
Are I missing something?
"Most classes in concurrency package allow concurrent access."
Regrading this, how about this:
Collection c = Collections.synchronizedCollection(a);
synchronized(c){
...
}
Doesn't this allow concurrent access to 'C' too?

size

【在 g*****g 的大作中提到】
: Most classes in concurrency package allow concurrent access. Therefore size
: is not accurate.

avatar
r*r
62
是不是可以这样理解。J2EE 就是方便建房子,但房子建好后,里面还需要各种家具,
摆设和设施,而这些家具,装潢和设施,通常都有 Java core 的部分就够了。比如,
现在很火的 machine learning, big data 都不需要 J2EE 的任何功能。就拿一个传统
的网上购物系统来说,这个系统本身也不需要 J2EE, 但是它可能需要被置于 J2EE 的
环境中运行。
每个公司的产品,服务和技术都要通过网站来展示,所以每个企业都需要 J2EE 来架构
,方便架构。但这个框架下的内容,是不是大部分内容,都是靠 Java core 来完成?
所以二者都重要,50% - 50%, 好像很公平的。

【在 z*******3 的大作中提到】
: synchronized用在多个线程之间共享对象
: 但是实际工作中,这种情况都会被尽量避开
: 现在机器很强大了,也不用太过于担心一些对象的使用问题
: 就是说如果不同线程之间的对象需要交流的话
: 要注意override hashcode()来判断不同线程使用的对象是否指代同一个东西
: 写core java的程序员没有那么多
: 因为j2ee有大量的工具帮忙做事,开源的收费的都有
: 一般情况下,不用rebuild wheels
: 直接拿来用就好了,应该说每一个具体的应用,大部分都是j2ee的范畴
: j2ee就是用来做这事的

avatar
p*2
63

你都synchronized了,怎么concurrent呀?

【在 r******r 的大作中提到】
: I feel members like "size" & "capacity" are highly time sensitive in
: multiple threading environment. It's accurate at a time point。By‘not
: accurate', I think you mean the value of size changes quickly because of
: concurrent accesses. It doesn't really mean it's wrong; otherwise the
: concurrency isn't thread safe, which isn't the case.
: Are I missing something?
: "Most classes in concurrency package allow concurrent access."
: Regrading this, how about this:
: Collection c = Collections.synchronizedCollection(a);
: synchronized(c){

avatar
p*2
64


如果网站的话,真看不出来为什么用J2EE

【在 r******r 的大作中提到】
: 是不是可以这样理解。J2EE 就是方便建房子,但房子建好后,里面还需要各种家具,
: 摆设和设施,而这些家具,装潢和设施,通常都有 Java core 的部分就够了。比如,
: 现在很火的 machine learning, big data 都不需要 J2EE 的任何功能。就拿一个传统
: 的网上购物系统来说,这个系统本身也不需要 J2EE, 但是它可能需要被置于 J2EE 的
: 环境中运行。
: 每个公司的产品,服务和技术都要通过网站来展示,所以每个企业都需要 J2EE 来架构
: ,方便架构。但这个框架下的内容,是不是大部分内容,都是靠 Java core 来完成?
: 所以二者都重要,50% - 50%, 好像很公平的。

avatar
r*r
65
Concurrency 是目的,synchronized 是实现目的的途径之一。难道有错?
还是你理解错了

【在 p*****2 的大作中提到】
:
: ?
: 如果网站的话,真看不出来为什么用J2EE

avatar
r*r
66
个人主页当然不用。企业网站不用 J2EE,那就用微软的好了

【在 p*****2 的大作中提到】
:
: ?
: 如果网站的话,真看不出来为什么用J2EE

avatar
c*m
67
Most modern implementation uses an integer field to track size so it's not a
heavy operation at all.
The returned collection in your example is synchronized already so there's
no need to put it in a synchronized block. Plus, your way of synchronizing
over the object itself while it's synchronized looks weird.
Accessing of the collections in concurrent packages are still thread safe.
However, getting precise size in a multi-threading dynamic environment
usually means very little since it's a moving target all the time which can
be hardly relied on, unless, of course, you put everything in a synchronized
block, which is usually bad design and beats the whole purpose of the new
concurrency packages.

【在 r******r 的大作中提到】
: I feel members like "size" & "capacity" are highly time sensitive in
: multiple threading environment. It's accurate at a time point。By‘not
: accurate', I think you mean the value of size changes quickly because of
: concurrent accesses. It doesn't really mean it's wrong; otherwise the
: concurrency isn't thread safe, which isn't the case.
: Are I missing something?
: "Most classes in concurrency package allow concurrent access."
: Regrading this, how about this:
: Collection c = Collections.synchronizedCollection(a);
: synchronized(c){

avatar
r*r
68
"The returned collection in your example is synchronized already so there's
no need to put it in a synchronized block."
I agree with you on this. However, read this from Java API Doc. Especially
in the iteration,there is no modification.
" It is imperative that the user manually synchronize on the returned
collection when iterating over it:
Collection c = Collections.synchronizedCollection(myCollection);
...
synchronized(c) {
Iterator i = c.iterator(); // Must be in the synchronized block
while (i.hasNext())
foo(i.next());
}
Failure to follow this advice may result in non-deterministic behavior. "
http://docs.oracle.com/javase/6/docs/api/java/util/Collections.

a
can
synchronized

【在 c*m 的大作中提到】
: Most modern implementation uses an integer field to track size so it's not a
: heavy operation at all.
: The returned collection in your example is synchronized already so there's
: no need to put it in a synchronized block. Plus, your way of synchronizing
: over the object itself while it's synchronized looks weird.
: Accessing of the collections in concurrent packages are still thread safe.
: However, getting precise size in a multi-threading dynamic environment
: usually means very little since it's a moving target all the time which can
: be hardly relied on, unless, of course, you put everything in a synchronized
: block, which is usually bad design and beats the whole purpose of the new

avatar
g*g
69
It would be accurate if only one thread is allow to operate on the
collection, which is not the case for class like ConcurrentHashMap.

s

【在 r******r 的大作中提到】
: "The returned collection in your example is synchronized already so there's
: no need to put it in a synchronized block."
: I agree with you on this. However, read this from Java API Doc. Especially
: in the iteration,there is no modification.
: " It is imperative that the user manually synchronize on the returned
: collection when iterating over it:
: Collection c = Collections.synchronizedCollection(myCollection);
: ...
: synchronized(c) {
: Iterator i = c.iterator(); // Must be in the synchronized block

avatar
p*2
70

这两个不是一对矛盾吗?怎么跑一起去了?我感觉世界观要颠覆了。

【在 r******r 的大作中提到】
: Concurrency 是目的,synchronized 是实现目的的途径之一。难道有错?
: 还是你理解错了

avatar
c*m
71
I see what you are trying to achieve.Yeah the provided synchronization is on
the method level. If a node is added or removed while the collection is
being iterated over, it's going to throw an cocurrentmodificationexception.
Nonetheless I do think this is the only case you need to synchronize on the
whole collection, and should be avoided in general. If you do need to
iterate, try copyonwritearray which you can iterate without blocking
everyone else.

s

【在 r******r 的大作中提到】
: "The returned collection in your example is synchronized already so there's
: no need to put it in a synchronized block."
: I agree with you on this. However, read this from Java API Doc. Especially
: in the iteration,there is no modification.
: " It is imperative that the user manually synchronize on the returned
: collection when iterating over it:
: Collection c = Collections.synchronizedCollection(myCollection);
: ...
: synchronized(c) {
: Iterator i = c.iterator(); // Must be in the synchronized block

avatar
r*r
72
猪头,你的概念有误。
做 synchronized 是为什么? 不就是为了协调多个线程对共享资源访问的一种方式吗
?而多线程对共享资源的访问,不就是 concurrent access 吗?
我的理解是,java.util.concurrent 包讲各种处理多线程的方式和典型的数据结构,
比如 ConcurrentHashMap 放在一起,方便用户使用,但这个库中并不排斥
synchronized 的方式,而且还肯定用到了 synchronized.

【在 p*****2 的大作中提到】
:
: 这两个不是一对矛盾吗?怎么跑一起去了?我感觉世界观要颠覆了。

avatar
p*2
73

谈到这里就没啥好说的了,只能说你真牛。

【在 r******r 的大作中提到】
: 猪头,你的概念有误。
: 做 synchronized 是为什么? 不就是为了协调多个线程对共享资源访问的一种方式吗
: ?而多线程对共享资源的访问,不就是 concurrent access 吗?
: 我的理解是,java.util.concurrent 包讲各种处理多线程的方式和典型的数据结构,
: 比如 ConcurrentHashMap 放在一起,方便用户使用,但这个库中并不排斥
: synchronized 的方式,而且还肯定用到了 synchronized.

avatar
r*r
74
真的是我概念理解有误?

【在 p*****2 的大作中提到】
:
: 谈到这里就没啥好说的了,只能说你真牛。

avatar
p*2
75

有没有看过Java in concurrency?

【在 r******r 的大作中提到】
: 真的是我概念理解有误?
avatar
r*r
76
听说过,要买这本好书,好好研读。
但是,弄懂这个 concurrency & synchronized 的概念关系问题,不需要钻研那本书。
再想了想,还是您混淆了概念!
看看 Oracle Java Tutorial 的网站,所有的多线程问题都在 Concurrency 这个主题
下面讲述,而且 synchronization 是其中的一个章节而已。
看看这里,
http://docs.oracle.com/javase/tutorial/essential/concurrency/sy

【在 p*****2 的大作中提到】
:
: 有没有看过Java in concurrency?

avatar
z*e
77
你这么理解倒也不错,但是可以更贴切一点
j2ee是engineering的东西,所以很多概念就都来自engineering
来自飞机制造以及建筑学等领域
用建筑学来比喻更好一点
j2ee的一成套软件就是帮你把framework给搭建好
你看建房子就知道了,一般都是先打起一个框架来
这个框架里面什么都没有,连墙壁都是空的,完全就是一个横的和竖的钢筋的交叉
但是光有框架是不能住人的,离真正的建筑还很远
等这个框架搭建好了之后,再把墙壁什么给填进去
core java的工作就是搭建这些框架
而j2ee的工作就是填入这些还不存在的部分也就是组件
这两份工作可以分开做,由不同的人和不同的group完成
比如框架一般由red hat,ibm这些公司完成,组件则由银行的it division等完成
当然这都是建房子,都是钢筋混凝土,所以从某种意义上说,这两批人都毕业自同一所
大学
以及同一个专业,他们之前很有可能是同学,所以这两者之间的界限很模糊
另外还有一些公司不太一样,这些公司不用别人的框架,大多数时候都自己造
从框架到组件都是自行完成,当然这样做有好处,好处就是可以在一定程度上优化代码
毕竟都是自己写的东西,很多规范可以不遵守,怎么快怎么来
但是这样做的坏处就是,维护成本增加,因为随着代码量的上升,新来的人要看懂现有
代码
都是一项非常艰巨的任务,这不仅需要有一定的财力,还需要技术人员有足够的技术基础
造框架可不是一件容易的事,涉及到很多很恶心很底层的概念,光理解这些概念,就够
喝一壶了
j2ee的好处就在于不同公司之间的经验可以共享,新人来了就不需要太多时间的培训
短时间内可以上手干活,这就节省了成本,说到底都是经济问题
当然如果公司有钱,这都不是问题
machine learning貌似不怎么火,big table这个是针对db而言的,persistence层面的
东西
j2ee并不涉及如何persistence,而是提供一个标准接口给db之类的工具
由db来完成真正的持久化操作,big table不是db,或者说是另外一种新型的
persistence
所以也不能算是j2ee管的范畴,当然将来这个标准会不会扩展到这一块去
那这个也不是没有可能,还有就是对于现有的标准,可以想办法兼容
比如google做的objectify,就开始逐步向jpa的标准靠拢,尤其是各种annotation
虽然app engine不是db,但是依旧可以在对外接口上保持跟jpa一致
这样就降低了使用者熟悉这个工具的门槛
对于开发者来说,不需要在乎他面对的是什么persistence软件,可能是db也可能不是
db
只要他用的接口都是jpa标准下的,那使用的方法是一样



【在 r******r 的大作中提到】
: 是不是可以这样理解。J2EE 就是方便建房子,但房子建好后,里面还需要各种家具,
: 摆设和设施,而这些家具,装潢和设施,通常都有 Java core 的部分就够了。比如,
: 现在很火的 machine learning, big data 都不需要 J2EE 的任何功能。就拿一个传统
: 的网上购物系统来说,这个系统本身也不需要 J2EE, 但是它可能需要被置于 J2EE 的
: 环境中运行。
: 每个公司的产品,服务和技术都要通过网站来展示,所以每个企业都需要 J2EE 来架构
: ,方便架构。但这个框架下的内容,是不是大部分内容,都是靠 Java core 来完成?
: 所以二者都重要,50% - 50%, 好像很公平的。

avatar
p*2
78

如果你好好读读这个link确实也不一定需要那本书了。

【在 r******r 的大作中提到】
: 听说过,要买这本好书,好好研读。
: 但是,弄懂这个 concurrency & synchronized 的概念关系问题,不需要钻研那本书。
: 再想了想,还是您混淆了概念!
: 看看 Oracle Java Tutorial 的网站,所有的多线程问题都在 Concurrency 这个主题
: 下面讲述,而且 synchronization 是其中的一个章节而已。
: 看看这里,
: http://docs.oracle.com/javase/tutorial/essential/concurrency/sy

avatar
z*e
79
j2ee技术定期也会更新
而且社区非常活跃,各种乱七八糟的东西层出不穷
但是不管怎样,spring和hibernate是最流行的两个
先熟悉了之后再搞其它的也不迟
这两个搞完之后直接上jboss吧,jboss里面有好多好玩的东西
而且jboss是最规范的组件集合,其中就包括了hibernate
你可以熟悉熟悉,其中jms和ejb是比较常用的两个,除了jpa以外
validation和transaction应该也常用吧?
说多其实倒也不多,大多数时候干活时候还是要看看doc的
具体包含的各个门类,wiki上关于j2ee的介绍里面就有
http://en.wikipedia.org/wiki/J2ee

Hibernate

【在 p*****2 的大作中提到】
:
: 如果你好好读读这个link确实也不一定需要那本书了。

avatar
z*e
80
javax.faces.*
javax.faces.component.*
这两个就是大名鼎鼎的jsf
web层的东西
javax.enterprise.inject.*
这个对于spring熟悉的话,这一块也不难
javax.enterprise.context.*
javax.ejb.*
这两个都是ejb的东西,第一个说的是容器的概念
如何向容器申请需要的资源的api
对ejb2熟悉的话,这个应该没什么了
以上三个都是business层的东西
javax.validation.*
这个最早是hibernate的一个部分,做得很好了之后独立出来单独搞
javax.persistence.*
javax.transaction.*
jpa相关的东西,可以理解成是跟db相关的部分,transaction什么应该都知道吧?
以上三个都是persistence层的东西,都是hibernate那个gavin king牵头搞的
javax.jms.*
这个最早是ejb的一个部分,最早ejb有stateful, stateless和message bean
这个其实用在异步处理上比较多,最早的异步调用都是用jms完成
现在ejb也可以搞定了,用stateless的一个annotation就行
不过这本来也就是ejb的一个部分
javax.resource.*
对于所有非java以及db以外的资源,统统用这个来调用
其中就包括jca等eai常用的接口,这一块算是最高级的j2ee了
当然jms已经开始有些高级了
最后两个是eai的东西,已经脱离单系统层面了
后面还有,esb,bpel之类的,但那都高于j2ee了
其实j2ee也没有你想的那么大
avatar
z*e
81
jsf怎么搞不清楚,将来怎么发展也不知道
其它几个应该都很过硬了,也就是ejb稍微有点弱
但是经过对spring的借鉴,强很多了
现在jee比以前的j2ee要简单
最难的应该是ejb2,其它都好办
ejb2那四个接口真是恶心啊,不过如果搞过rmi的话
ejb2的remote接口也不难理解
esb之类也不过是概念,具体实践倒腾倒腾就会了
做多也没意思,前几天跟老大聊天
老大说,这些东西鬼子看着很神奇,但是到底怎样
你自己清楚,就好比拉面,老外看拉面,很神奇
还拿个手机在那边拍,但是做多了,你自己知道
不过如此,找点有趣的挑战玩吧
我们这边的大学对web service的参与比较活跃
所以我们以后有可能会多搞这一块东东
avatar
p*2
82

多谢大牛。太详细了。

【在 z****e 的大作中提到】
: j2ee技术定期也会更新
: 而且社区非常活跃,各种乱七八糟的东西层出不穷
: 但是不管怎样,spring和hibernate是最流行的两个
: 先熟悉了之后再搞其它的也不迟
: 这两个搞完之后直接上jboss吧,jboss里面有好多好玩的东西
: 而且jboss是最规范的组件集合,其中就包括了hibernate
: 你可以熟悉熟悉,其中jms和ejb是比较常用的两个,除了jpa以外
: validation和transaction应该也常用吧?
: 说多其实倒也不多,大多数时候干活时候还是要看看doc的
: 具体包含的各个门类,wiki上关于j2ee的介绍里面就有

avatar
x*d
83
for (int i = 0; i < vector.size(); i++)
doSomething(vector.get(i));
above iteration may throw ArrayIndexOutOfBoundsException. so, better lock it.
synchronized (vector) {
for (int i = 0; i < vector.size(); i++)
doSomething(vector.get(i));
}
if the modification count that associated with the collection changes during
iteration, hasNext or next throws ConcurrentModificationException.

s

【在 r******r 的大作中提到】
: "The returned collection in your example is synchronized already so there's
: no need to put it in a synchronized block."
: I agree with you on this. However, read this from Java API Doc. Especially
: in the iteration,there is no modification.
: " It is imperative that the user manually synchronize on the returned
: collection when iterating over it:
: Collection c = Collections.synchronizedCollection(myCollection);
: ...
: synchronized(c) {
: Iterator i = c.iterator(); // Must be in the synchronized block

avatar
z*e
84
微软的要钱,用开源的php,python之类的

【在 r******r 的大作中提到】
: 个人主页当然不用。企业网站不用 J2EE,那就用微软的好了
avatar
x*d
85
I have this book... ... :)


【在 r******r 的大作中提到】
: 听说过,要买这本好书,好好研读。
: 但是,弄懂这个 concurrency & synchronized 的概念关系问题,不需要钻研那本书。
: 再想了想,还是您混淆了概念!
: 看看 Oracle Java Tutorial 的网站,所有的多线程问题都在 Concurrency 这个主题
: 下面讲述,而且 synchronization 是其中的一个章节而已。
: 看看这里,
: http://docs.oracle.com/javase/tutorial/essential/concurrency/sy

avatar
r*r
86
如果自己想做小网站,是不是安装:
1. Eclipse
2. J2EE
3. MySQL
4. JavaScript
5. Maven
6. Perforce
前端的网页用什么 editor 呢?Eclipse 里好像没有。比如,至少要个简单的表格,不
需要自己去写 html table. 调个颜色,不需要自己去改属性。

【在 z****e 的大作中提到】
: 微软的要钱,用开源的php,python之类的
avatar
z*e
87
小网站直接上app engine之类的cloud服务简单很多
就是不规范,如果你自己倒腾,买一些托管的服务vps的话
需要钱,而且折腾
如果用app engine,直接下eclipse,然后下google的插件
安装上传都是集成的,比较容易,支持java和python
web上部分用dreamweaver

【在 r******r 的大作中提到】
: 如果自己想做小网站,是不是安装:
: 1. Eclipse
: 2. J2EE
: 3. MySQL
: 4. JavaScript
: 5. Maven
: 6. Perforce
: 前端的网页用什么 editor 呢?Eclipse 里好像没有。比如,至少要个简单的表格,不
: 需要自己去写 html table. 调个颜色,不需要自己去改属性。

avatar
r*r
88
自己弄弄,可以学的快, 知道是怎么回事

【在 z****e 的大作中提到】
: 小网站直接上app engine之类的cloud服务简单很多
: 就是不规范,如果你自己倒腾,买一些托管的服务vps的话
: 需要钱,而且折腾
: 如果用app engine,直接下eclipse,然后下google的插件
: 安装上传都是集成的,比较容易,支持java和python
: web上部分用dreamweaver

avatar
z*e
89
托管的话,要钱

【在 r******r 的大作中提到】
: 自己弄弄,可以学的快, 知道是怎么回事
avatar
x*d
90
try Amazon EC2, one year free.


【在 z****e 的大作中提到】
: 托管的话,要钱
avatar
x*d
91
My opinion, vmware is the best, ask some experienced users do an image for
you. Don't do tomcat/jboss, linux, database, build tools, and other
installation. It is irrelevant and waste a lot of time. Most java developer,
typical junior/intermedia, in the company environment, dont touch these
process, you just do code, follow check in process.
So, get a mentor, he/she should set up everything for you the same as at
work, do you a vm image, and you just do code, unit test, and check in, and
the mentor build it for you, test for you. Enough, if he is really nice, he
can review the code together with you, but not necessary.
Once you are comfortable, get a real job, and when you have money, energy
and time, you can build your own environment, installation, admin is pretty
straight forward, if someone show you once, you should be able to do it.
Most interviewer only care if you know java. And no way for him to test if
you know the build script or not, unless the job is specific for
configuration management or CI.
Another option is that someone write you the build scripts, you just do edit
, package/build and deploy, "mvn package" is enough, or if the build script
includes database and app server, and others, everything, maybe you just do
mvn jetty: run.
Or you can try spring roo, but I think most company still dont use it. So
you might learn something that you never use.

【在 r******r 的大作中提到】
: 自己弄弄,可以学的快, 知道是怎么回事
avatar
x*d
92
I am against this idea, it is very old fashion, I see people waste a lot of
time on this. see my other post for suggestion.

【在 r******r 的大作中提到】
: 如果自己想做小网站,是不是安装:
: 1. Eclipse
: 2. J2EE
: 3. MySQL
: 4. JavaScript
: 5. Maven
: 6. Perforce
: 前端的网页用什么 editor 呢?Eclipse 里好像没有。比如,至少要个简单的表格,不
: 需要自己去写 html table. 调个颜色,不需要自己去改属性。

avatar
p*2
93

developer,
and
he
大牛只是说对了一半。其实用vmware的cloudfoundry就可以了。

【在 x****d 的大作中提到】
: My opinion, vmware is the best, ask some experienced users do an image for
: you. Don't do tomcat/jboss, linux, database, build tools, and other
: installation. It is irrelevant and waste a lot of time. Most java developer,
: typical junior/intermedia, in the company environment, dont touch these
: process, you just do code, follow check in process.
: So, get a mentor, he/she should set up everything for you the same as at
: work, do you a vm image, and you just do code, unit test, and check in, and
: the mentor build it for you, test for you. Enough, if he is really nice, he
: can review the code together with you, but not necessary.
: Once you are comfortable, get a real job, and when you have money, energy

avatar
z*e
94
只有一年免费,还不如open shift

【在 x****d 的大作中提到】
: try Amazon EC2, one year free.
:

avatar
x*d
95
and heroku.
but I dont like them, the key is mimicking work environment, right?

【在 p*****2 的大作中提到】
:
: developer,
: and
: he
: 大牛只是说对了一半。其实用vmware的cloudfoundry就可以了。

avatar
F*n
96
典型的ICC廉价码农模式

developer,
and
he

【在 x****d 的大作中提到】
: My opinion, vmware is the best, ask some experienced users do an image for
: you. Don't do tomcat/jboss, linux, database, build tools, and other
: installation. It is irrelevant and waste a lot of time. Most java developer,
: typical junior/intermedia, in the company environment, dont touch these
: process, you just do code, follow check in process.
: So, get a mentor, he/she should set up everything for you the same as at
: work, do you a vm image, and you just do code, unit test, and check in, and
: the mentor build it for you, test for you. Enough, if he is really nice, he
: can review the code together with you, but not necessary.
: Once you are comfortable, get a real job, and when you have money, energy

avatar
p*2
97

大牛说的对。我坚决不用。现在免费的太多了。

【在 z****e 的大作中提到】
: 只有一年免费,还不如open shift
avatar
p*2
98

focusing on coding only. Also you can get a real deployment in cloud.

【在 x****d 的大作中提到】
: and heroku.
: but I dont like them, the key is mimicking work environment, right?

avatar
x*d
99
why junior need something in cloud? to waste time or to disclose that he is
junior?
My suggestion was focusing coding only too, but in a real work environment.

【在 p*****2 的大作中提到】
:
: focusing on coding only. Also you can get a real deployment in cloud.

avatar
x*d
100
what is icc? good or bad? black cat white cat, getting rat is good cat.

【在 F****n 的大作中提到】
: 典型的ICC廉价码农模式
:
: developer,
: and
: he

avatar
x*d
101
all useless.

【在 z****e 的大作中提到】
: 只有一年免费,还不如open shift
avatar
z*e
102
open shift可以提供免费的3 gears的服务
而且是标准的j2ee组件,对付个人网站足够了

【在 x****d 的大作中提到】
: all useless.
avatar
x*d
103
why use java for personal site? so much time to kill? aws ec2 you can try
hadoop etc. almost everything. There is one click install images for all
kinds of java stacks, like jboss + mysql, jboss + liferay...

【在 z****e 的大作中提到】
: open shift可以提供免费的3 gears的服务
: 而且是标准的j2ee组件,对付个人网站足够了

avatar
z*e
104
目测某人只是想找个地方练手而已

【在 x****d 的大作中提到】
: why use java for personal site? so much time to kill? aws ec2 you can try
: hadoop etc. almost everything. There is one click install images for all
: kinds of java stacks, like jboss + mysql, jboss + liferay...

avatar
x*d
105
exercise what yah, just code and unit test, all else are useless skills at
the very beginning.

【在 z****e 的大作中提到】
: 目测某人只是想找个地方练手而已
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。