This will, in most languages, be safe (provided you're only using any specific array element within one thread at a time) - however, it's not a good idea.
The main problem is one of false sharing. By writing to items on the array from multiple threads, you'll get very, very poor performance, since you're constantly swapping cache lines. It's a particularly bad idea in managed languages like C# and Java. For example, in C#, the CLR does bounds checking on the array. This causes any array access to access a variable (the length) stored just before the first element of the array, which constantly causes cache misses to occur. A great demo of this was done by Igor Ostrovsky at PDC - you can see the parallel performance is many times slower than handling it serially because of this issue.
It's a better idea to push the work into the threads as separate data variables, and "compose" your array after the fact.